2016-03-13 25 views
2

许多编程语言的语法要求它们根据"maximal munch"原则进行标记。也就是说,这些令牌是根据输入流中可能的最大字符数构建的。PLY的词法分析器是否支持“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) 

据“最大适合”,这个代码的输出应为LexToken(EQUALITY,'==',1,0),但它是LexToken(ASSIGNMENT,'=',1,0) LexToken(ASSIGNMENT,'=',1,1)。这似乎是因为词法分析器倾向于ASSIGNMENT而不是EQUALITY--优先考虑较长的正则表达式而不是较长的匹配。

PLY的词法分析器可以遵循“最大蒙克”原则吗?

如果没有,是否有指示应如何设置标记以避免“上述不足最大的蒙克”情况?

回答

1

PLY使用Python自己的re包来匹配令牌,方法是将单个正则表达式构建为替代组合。由于python的正则表达式库不是最大的蒙克,PLY也不是。

相反,所选择的匹配是在这个大的正则表达式相匹配的第一模式,和顺序在PLY nanual记载:

当建立主正则表达式,规则在以下被添加顺序:

  • 通过函数定义的所有令牌以相同的顺序,因为它们出现在词法文件被添加。

  • 字符串定义的令牌按照正则表达式长度递减的顺序进行排序(首先添加更长的表达式)。

由于它匹配=图案较长,它是前面插入并==无法比拟的。

要修复它,使模式功能,然后根据需要进行排序。