由于特定关键字,Plyplus 会出现语法错误?

Plyplus gives syntax error because of specific keywords?

我正在使用 plyplus 设计一个简单的语法,一段时间以来我一直在为一些奇怪的错误而苦苦挣扎。请记住我是新手。这是重现该问题的一段代码:

from plyplus import Grammar

list_parser = Grammar("""
    start: context* ;
    context : WORD '{' (rule)* '}' ;
    rule: 'require' space_marker ;
    space_marker: 'newline'
        | 'tab'
        | 'space'
        ;

    WORD: '\w+' ;
    SPACES: '[ \t\n]+' (%ignore) ;
    """, auto_filter_tokens=False)

res = list_parser.parse("test { require tab }")

如果我的输入字符串包含 require spacerequire newline,它可以正常工作。但是,一旦我提供 require tab,就会抛出异常:

Traceback (most recent call last):
  File "/Users/bore/Projects/ThesisCode/CssCoco/coco/plytest.py", line 18, in <module>
    res = list_parser.parse("test { require tab }")
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/plyplus/plyplus.py", line 584, in parse
    return self._grammar.parse(text)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/plyplus/plyplus.py", line 668, in parse
    raise ParseError('\n'.join(self.errors))
plyplus.plyplus.ParseError: Syntax error in input at 'tab' (type WORD) line 1 col 16

具有讽刺意味的是,我每次 运行 代码时都不会遇到此异常,但恰好是三次。我注意到,如果我将语法和输入从 tab 更改为 ta,我每次 运行 代码时都会遇到相同的异常。另外,如果我将其更改为 tabb,错误就消失了。

错误表明 tab 被解析为 WORD 而不是 space_marker。但是,tabb 也是一个 WORD。从我的反复试验来看,plyplus 似乎对我作为关键字提供的特定字符串很敏感。我错过了什么吗?任何 help/hints/comments 将不胜感激!

PlyPlus 是 PLY 的一个实现,其中 L 和 Y 代表 Lex 和 Yacc,所以它是——无论好坏,probably worse——一个严格自下而上工作的 LR 解析器。这也意味着 'tab' 不能解析为 TAB(或 _ANON_X,或它为令牌生成的任何名称),因为您对 WORD 的定义非常慷慨。解决它的唯一方法是使定义更具限制性。例如:

WORD: '\w+' (%unless
    TAB: 'tab';
    REQ: 'require';
  );

我的猜测是它适用于 'newline''space',因为在某个地方有一个隐式定义的前置终端,它比 WORD 分配了更高的优先级,但是 PlyPlus 的文档也不完全是顶级 class,因此必须查看 PlyPlus 标记器的实际实现。