PLY 的词法分析器是否支持 "maximal munch"?

Does PLY's lexer support "maximal munch"?

许多编程语言的语法要求根据 "maximal munch" 原则对其进行标记化。也就是说,令牌是根据输入流中的最大可能字符数构建的。

PLY 的词法分析器似乎没有应用这个原则。例如:

import ply.lex as lex

tokens = ('ASSIGNMENT', 'EQUALITY')

t_ASSIGNMENT = r'[+\-*/]?='
t_EQUALITY   = r'=='

lexer = lex.lex()

lexer.input('==')
for tok in lexer:
    print(tok)

根据"maximal munch",这段代码的输出应该是LexToken(EQUALITY,'==',1,0),但是却是LexToken(ASSIGNMENT,'=',1,0) LexToken(ASSIGNMENT,'=',1,1)。这似乎是因为词法分析器更喜欢 ASSIGNMENT 而不是 EQUALITY - 优先考虑较长的正则表达式而不是较长的匹配。

是否可以让 PLY 的词法分析器遵循 "maximal munch" 原则?

如果没有,是否有关于如何指定令牌以避免 "less-than-maximal munch" 上述情况的指南?

PLY 使用 Python 自己的 re 包来匹配标记,通过构建单个正则表达式作为替代项的组合。由于 python 的正则表达式库不是 maximal munch,PLY 也不是。

相反,选择的匹配是这个大正则表达式中匹配的第一个模式,顺序记录在 PLY 手册中:

When building the master regular expression, rules are added in the following order:

  • 函数定义的所有标记都按照它们在词法分析器文件中出现的顺序添加。

  • 接下来添加由字符串定义的标记,方法是按照正则表达式长度递减的顺序对它们进行排序(首先添加较长的表达式)。

由于匹配=的模式较长,所以插入较早,==无法匹配

要修复它,请使模式起作用,然后根据需要对其进行排序。