- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
许多编程语言的语法要求根据 "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/
我正在使用 openstack 着色库来管理我们的 openstack 堆栈。一项任务是列出用户拥有的所有堆栈(例如,然后允许删除它们)。 着色库调用 list_stacks() 返回 munch.M
许多编程语言的语法要求根据 "maximal munch" 对其进行标记化原则。也就是说, token 是根据输入流中尽可能多的字符构建的。 PLY 的词法分析器似乎没有应用这个原则。例如: impo
cfront 包中的 munch 库(或程序?)是什么?是做什么用的? 最佳答案 Munch 用于扫描 nm 输出并查找静态构造函数/析构函数。 参见 code (带评论)在 SoftwarePres
在模块 Text.ParserCombinators.ReadP , munch (和 munch1 )文档说: Parses the first zero or more characters sa
我是一名优秀的程序员,十分优秀!