如何匹配子串和字符串本身?

问题描述 投票:1回答:1

我试图用lex标记一堆代码,并匹配不同类型的关键字与不同的正则表达式。当跟随正则表达式匹配时,它会标记与“VARIABLE”匹配的任何内容;

[_a-zA-Z][_a-zA-Z0-9]*

并跟随print语句匹配;

\s*print\((.*?)\)\s*

我需要的是当下面的陈述经过词法分析时;

myVar_12
print(myVar_12)

代币应该是这样的;

VARIABLE
PRINT VARIABLE

但我得到的是;

VARIABLE
PRINT

我开始像昨天一样学习正则表达式,无法弄清楚我应该怎么做。所以请原谅我毫无意义的正则表达式。

regex token lex
1个回答
1
投票

您已经在评论中澄清了您希望print成为关键字,无论它是否跟随参数列表。因此参数列表不应该是print的正则表达式¹的一部分。匹配print的正则表达式应该只是print

print                   return PRINT;
[_a-zA-Z][_a-zA-Z0-9]*  return VARIABLE;

请注意,顺序很重要,因为输入“print”可以由两个正则表达式匹配,如果多个正则表达式产生相同长度的匹配,lex将使用文件中首先出现的那个。因此,应始终在标识符规则之前定义关键字。

您还需要将括号识别为自己的令牌并忽略空格(可能)。


¹事实上它应该是正则表达式的一部分。但是如果你想让print成为一个上下文关键字,你需要一个不同的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.