由于特定关键字,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 space
或 require 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 标记器的实际实现。
我正在使用 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 space
或 require 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 标记器的实际实现。