解析任何字符,直到 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'),而不是直接在解析器规则中定义它们。
我正在尝试解析以下语法,其中 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'),而不是直接在解析器规则中定义它们。