@@ -105,14 +105,22 @@ class ZyLexer : LexerBase() {
105105 }
106106 tokenType = ZyTokenTypes .NUMBER
107107 }
108+ currentChar == ' $' -> {
109+ // PHP 变量 - 包含 $ 符号本身
110+ tokenEnd++
111+ while (tokenEnd < bufferEnd && (buffer!! [tokenEnd].isLetterOrDigit() || buffer!! [tokenEnd] == ' _' )) {
112+ tokenEnd++
113+ }
114+ tokenType = ZyTokenTypes .PHP_VARIABLE
115+ }
108116 currentChar.isLetter() || currentChar == ' _' -> {
109117 // 标识符或关键字
110118 tokenEnd++
111119 while (tokenEnd < bufferEnd && (buffer!! [tokenEnd].isLetterOrDigit() || buffer!! [tokenEnd] == ' _' )) {
112120 tokenEnd++
113121 }
114122 val text = buffer!! .subSequence(tokenStart, tokenEnd).toString()
115- tokenType = if (isKeyword( text)) ZyTokenTypes . KEYWORD else ZyTokenTypes . IDENTIFIER
123+ tokenType = getTokenTypeForText( text)
116124 }
117125 else -> {
118126 // 其他字符
@@ -123,17 +131,141 @@ class ZyLexer : LexerBase() {
123131 }
124132
125133 /* *
126- * 检查文本是否为关键字
134+ * 根据文本内容确定标记类型
127135 * @param text 要检查的文本
128- * @return 如果是关键字返回 true,否则返回 false
136+ * @return 对应的标记类型
129137 */
130- private fun isKeyword (text : String ): Boolean {
131- // ZY 语言支持的关键字列表
132- val keywords = setOf (
138+ private fun getTokenTypeForText (text : String ): IElementType {
139+ return when {
140+ isZyKeyword(text) -> ZyTokenTypes .KEYWORD
141+ isPhpKeyword(text) -> ZyTokenTypes .PHP_KEYWORD
142+ isPhpFunction(text) -> ZyTokenTypes .PHP_FUNCTION
143+ isPhpConstant(text) -> ZyTokenTypes .PHP_CONSTANT
144+ else -> ZyTokenTypes .IDENTIFIER
145+ }
146+ }
147+
148+ /* *
149+ * 检查文本是否为 ZY 语言关键字
150+ * @param text 要检查的文本
151+ * @return 如果是 ZY 关键字返回 true,否则返回 false
152+ */
153+ private fun isZyKeyword (text : String ): Boolean {
154+ val zyKeywords = setOf (
133155 " function" , " if" , " else" , " for" , " while" , " return" , " var" , " let" , " const" ,
134156 " true" , " false" , " null" , " undefined" , " import" , " export" , " class" , " interface"
135157 )
136- return keywords.contains(text)
158+ return zyKeywords.contains(text)
159+ }
160+
161+ /* *
162+ * 检查文本是否为 PHP 关键字
163+ * @param text 要检查的文本
164+ * @return 如果是 PHP 关键字返回 true,否则返回 false
165+ */
166+ private fun isPhpKeyword (text : String ): Boolean {
167+ val phpKeywords = setOf (
168+ // PHP 控制结构
169+ " if" , " else" , " elseif" , " endif" , " while" , " endwhile" , " for" , " foreach" , " endforeach" ,
170+ " do" , " switch" , " case" , " default" , " break" , " continue" , " goto" ,
171+
172+ // PHP 函数和类
173+ " function" , " class" , " interface" , " trait" , " namespace" , " use" , " as" ,
174+ " public" , " private" , " protected" , " static" , " abstract" , " final" ,
175+ " extends" , " implements" , " new" , " clone" , " instanceof" ,
176+
177+ // PHP 变量和常量
178+ " global" , " static" , " const" , " define" , " defined" ,
179+
180+ // PHP 异常处理
181+ " try" , " catch" , " finally" , " throw" ,
182+
183+ // PHP 包含和引用
184+ " include" , " include_once" , " require" , " require_once" ,
185+
186+ // PHP 其他关键字
187+ " return" , " yield" , " echo" , " print" , " print_r" , " var_dump" ,
188+ " isset" , " empty" , " unset" , " die" , " exit" ,
189+
190+ // PHP 类型声明
191+ " array" , " string" , " int" , " float" , " bool" , " object" , " mixed" , " void" ,
192+ " callable" , " iterable" , " resource" , " null" , " false" , " true" ,
193+
194+ // PHP 魔术方法
195+ " __construct" , " __destruct" , " __call" , " __callStatic" , " __get" , " __set" ,
196+ " __isset" , " __unset" , " __sleep" , " __wakeup" , " __toString" , " __invoke" ,
197+ " __set_state" , " __clone" , " __debugInfo"
198+ )
199+ return phpKeywords.contains(text)
200+ }
201+
202+ /* *
203+ * 检查文本是否为 PHP 内置函数
204+ * @param text 要检查的文本
205+ * @return 如果是 PHP 函数返回 true,否则返回 false
206+ */
207+ private fun isPhpFunction (text : String ): Boolean {
208+ val phpFunctions = setOf (
209+ // 字符串函数
210+ " strlen" , " strpos" , " str_replace" , " substr" , " trim" , " ltrim" , " rtrim" ,
211+ " strtolower" , " strtoupper" , " ucfirst" , " ucwords" , " str_split" , " explode" , " implode" ,
212+ " sprintf" , " printf" , " htmlspecialchars" , " htmlentities" , " strip_tags" ,
213+
214+ // 数组函数
215+ " array" , " count" , " sizeof" , " array_push" , " array_pop" , " array_shift" , " array_unshift" ,
216+ " array_merge" , " array_slice" , " array_splice" , " array_keys" , " array_values" ,
217+ " array_search" , " in_array" , " array_unique" , " array_reverse" , " sort" , " rsort" ,
218+ " asort" , " arsort" , " ksort" , " krsort" , " usort" , " uasort" , " uksort" ,
219+
220+ // 文件系统函数
221+ " file_exists" , " is_file" , " is_dir" , " file_get_contents" , " file_put_contents" ,
222+ " fopen" , " fclose" , " fread" , " fwrite" , " fgets" , " fgetc" , " feof" , " fseek" , " ftell" ,
223+ " copy" , " move_uploaded_file" , " unlink" , " mkdir" , " rmdir" , " chmod" , " chown" ,
224+
225+ // 数学函数
226+ " abs" , " ceil" , " floor" , " round" , " min" , " max" , " rand" , " mt_rand" , " pi" ,
227+ " pow" , " sqrt" , " sin" , " cos" , " tan" , " asin" , " acos" , " atan" , " log" , " exp" ,
228+
229+ // 日期时间函数
230+ " date" , " time" , " strtotime" , " mktime" , " getdate" , " gmdate" , " microtime" ,
231+
232+ // 数据库函数
233+ " mysql_connect" , " mysql_query" , " mysql_fetch_array" , " mysql_fetch_assoc" ,
234+ " mysqli_connect" , " mysqli_query" , " mysqli_fetch_array" , " mysqli_fetch_assoc" ,
235+ " pdo" , " PDO" ,
236+
237+ // 其他常用函数
238+ " json_encode" , " json_decode" , " serialize" , " unserialize" , " var_dump" , " print_r" ,
239+ " gettype" , " is_array" , " is_string" , " is_numeric" , " is_null" , " is_bool" ,
240+ " filter_var" , " filter_input" , " preg_match" , " preg_replace" , " preg_split"
241+ )
242+ return phpFunctions.contains(text)
243+ }
244+
245+ /* *
246+ * 检查文本是否为 PHP 常量
247+ * @param text 要检查的文本
248+ * @return 如果是 PHP 常量返回 true,否则返回 false
249+ */
250+ private fun isPhpConstant (text : String ): Boolean {
251+ val phpConstants = setOf (
252+ // PHP 预定义常量
253+ " PHP_VERSION" , " PHP_OS" , " PHP_EOL" , " PHP_INT_MAX" , " PHP_INT_MIN" ,
254+ " PHP_FLOAT_MAX" , " PHP_FLOAT_MIN" , " PHP_SAPI" , " PHP_BINARY" ,
255+
256+ // 错误级别常量
257+ " E_ERROR" , " E_WARNING" , " E_PARSE" , " E_NOTICE" , " E_CORE_ERROR" , " E_CORE_WARNING" ,
258+ " E_COMPILE_ERROR" , " E_COMPILE_WARNING" , " E_USER_ERROR" , " E_USER_WARNING" ,
259+ " E_USER_NOTICE" , " E_STRICT" , " E_RECOVERABLE_ERROR" , " E_DEPRECATED" , " E_USER_DEPRECATED" ,
260+ " E_ALL" ,
261+
262+ // 文件系统常量
263+ " DIRECTORY_SEPARATOR" , " PATH_SEPARATOR" , " FILE_SEPARATOR" ,
264+
265+ // 其他常量
266+ " TRUE" , " FALSE" , " NULL" , " M_PI" , " M_E" , " M_LOG2E" , " M_LOG10E" , " M_LN2" , " M_LN10"
267+ )
268+ return phpConstants.contains(text)
137269 }
138270
139271 override fun getBufferSequence (): CharSequence = buffer!!
0 commit comments