我试图用lex标记一堆代码,并匹配不同类型的关键字与不同的正则表达式。当跟随正则表达式匹配时,它会标记与“VARIABLE”匹配的任何内容;
[_a-zA-Z][_a-zA-Z0-9]*
并跟随print语句匹配;
\s*print\((.*?)\)\s*
我需要的是当下面的陈述经过词法分析时;
myVar_12
print(myVar_12)
代币应该是这样的;
VARIABLE
PRINT VARIABLE
但我得到的是;
VARIABLE
PRINT
我开始像昨天一样学习正则表达式,无法弄清楚我应该怎么做。所以请原谅我毫无意义的正则表达式。
您已经在评论中澄清了您希望print
成为关键字,无论它是否跟随参数列表。因此参数列表不应该是print
的正则表达式¹的一部分。匹配print
的正则表达式应该只是print
。
print return PRINT;
[_a-zA-Z][_a-zA-Z0-9]* return VARIABLE;
请注意,顺序很重要,因为输入“print”可以由两个正则表达式匹配,如果多个正则表达式产生相同长度的匹配,lex
将使用文件中首先出现的那个。因此,应始终在标识符规则之前定义关键字。
您还需要将括号识别为自己的令牌并忽略空格(可能)。
¹事实上它应该是正则表达式的一部分。但是如果你想让print
成为一个上下文关键字,你需要一个不同的解决方案。