解析任何字符,直到 ANTLR4 中的分号

Parse any character until semicolon in ANTLR4

我正在尝试解析以下语法,其中 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 ';'

价值规则太贪心了。 Lexer 规则尝试尽可能多地匹配,因此对于这样的输入:pragma mu foo;,Value 规则将匹配 pragma mu foo。毕竟,那是分号以外的零个或多个字符。

Value 不太适合用作词法分析器规则。我建议你重新考虑你的方法。也许创建一个解析器规则 value 匹配 Identifier 和其他词法分析器规则。在没有看到很多 "real" 语法的情况下很难提出建议(您可能发布了您正在处理的语法的简化版本)。

试试这个:

pragmaDirective : 'pragma' Identifier .*? ';' ;

并删除 Value 规则。这应该可以完成工作。

还有一个建议:为您的文字定义 lexer 规则(如 'pragma'),而不是直接在解析器规则中定义它们。