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

时间:2019-03-31 10:03:19

标签: regex token lex

我正在尝试用lex标记一堆代码,并使用不同的正则表达式匹配不同类型的关键字。当遵循正则表达式匹配时,它会将与“ VARIABLE”匹配的所有内容标记化;

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

然后与print语句匹配;

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

我需要的是下面的语句经过词法分析时;

myVar_12
print(myVar_12)

代币应该像;

VARIABLE
PRINT VARIABLE

但是我得到的是

VARIABLE
PRINT

像昨天一样,我开始学习正则表达式,却不知道该怎么办。因此,请原谅我毫无意义的正则表达式。

1 个答案:

答案 0 :(得分:1)

您已在注释中阐明了希望print作为关键字,而不管其后面是否有参数列表。因此,参数列表不应成为print的正则表达式¹的一部分。匹配print的正则表达式应简单地为print

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

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

您还希望将括号识别为自己的标记,并忽略空格(大概是空白)。


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