我正在尝试解析以下语法,其中Value
可以是分号之外的任何字符,但我无法使其正常工作:
grammar Test;
pragmaDirective : 'pragma' Identifier Value ';' ;
Identifier : [a-z]+ ;
Value : ~';'* ;
WS : [ \t\r\n\u000C]+ -> skip ;
当我使用pragma foo bar;
对其进行测试时,出现以下错误:
line 1:6 extraneous input ' ' expecting Identifier
line 1:11 extraneous input 'bar' expecting ';'
答案 0 :(得分:1)
试试这个:
{{1}}
并删除{{1}}规则。那应该可以胜任。
建议:为文字定义 lexer 规则(如“pragma”),而不是直接在解析器规则中定义它们。
答案 1 :(得分:0)
价值规则过于贪婪。 Lexer规则尝试尽可能匹配,因此对于这样的输入:pragma mu foo;
,Value规则将匹配pragma mu foo
。毕竟,除了分号之外,这是零个或多个字符。
Value
不适合用作词法分析器规则。我建议你重新考虑一下你的做法。也许创建一个与value
和其他词法规则相匹配的解析器规则Identifier
。如果没有看到很多“真正的”语法,很难提出建议(你可能发布了一个你正在研究的语法的愚蠢版本)。