gpt4 book ai didi

python - PLY 的词法分析器支持 "maximal munch"吗?

转载 作者:行者123 更新时间:2023-11-28 17:29:05 25 4
gpt4 key购买 nike

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

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 的词法分析器遵循“最大咀嚼”原则?

如果没有,是否有关于如何指定 token 以避免“小于最大咀嚼”情况(例如上述情况)的指南?

最佳答案

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

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

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

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

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

由于匹配到=的pattern较长,所以插入较早,==无法匹配。

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

关于python - PLY 的词法分析器支持 "maximal munch"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35976428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com