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

How to match with both substring and string itself?

我正在尝试用 lex 标记一堆代码,并用不同的正则表达式匹配不同类型的关键字。当遵循正则表达式匹配时,它会标记与 "VARIABLE";

匹配的任何内容
[_a-zA-Z][_a-zA-Z0-9]*

下面与打印语句相匹配;

\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 使用第一个文件。因此,应始终在标识符规则之前定义关键字。

您还需要将括号识别为它们自己的标记并忽略白色 space(大概)。


¹ 事实上,无论哪种方式,它都应该是正则表达式的一部分。但是,如果您希望 print 成为上下文关键字,则需要不同的解决方案。