我正在尝试用lex标记一堆代码,并使用不同的正则表达式匹配不同类型的关键字。当遵循正则表达式匹配时,它会将与“ VARIABLE”匹配的所有内容标记化;
[_a-zA-Z][_a-zA-Z0-9]*
然后与print语句匹配;
\s*print\((.*?)\)\s*
我需要的是下面的语句经过词法分析时;
myVar_12
print(myVar_12)
代币应该像;
VARIABLE
PRINT VARIABLE
但是我得到的是
VARIABLE
PRINT
像昨天一样,我开始学习正则表达式,却不知道该怎么办。因此,请原谅我毫无意义的正则表达式。
答案 0 :(得分:1)
您已在注释中阐明了希望print
作为关键字,而不管其后面是否有参数列表。因此,参数列表不应成为print
的正则表达式¹的一部分。匹配print
的正则表达式应简单地为print
。
print return PRINT;
[_a-zA-Z][_a-zA-Z0-9]* return VARIABLE;
请注意顺序很重要,因为两个正则表达式都可以匹配输入的“ print”,并且如果多个正则表达式产生相同长度的匹配项,lex
将使用文件中第一位的匹配项。因此,应该始终在标识符规则之前定义关键字。
您还希望将括号识别为自己的标记,并忽略空格(大概是空白)。
¹实际上,无论哪种方式,它都应该是正则表达式的一部分。但是,如果您希望print
作为上下文关键字,则需要其他解决方案。