首页 > 解决方案 > 如何匹配子字符串和字符串本身?

问题描述

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

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

并与 print 语句匹配;

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

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

myVar_12
print(myVar_12)

代币应该是这样的;

VARIABLE
PRINT VARIABLE

但我得到的是;

VARIABLE
PRINT

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

标签: regextokenlex

解决方案


您已在评论中阐明您想print成为关键字,无论它是否后跟参数列表。因此,参数列表不应该是print' regex¹ 的一部分。要匹配的正则表达式print应该只是print.

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

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

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


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


推荐阅读