如何解决简单的歧义 [英] how to resolve simple ambiguity
问题描述
我刚开始使用Antlr并陷入困境.我有下面的语法,并试图解决歧义来分析输入,如Field:ValueString.
I just started using Antlr and am stuck. I have the below grammar and am trying to resolve the ambiguity to parse input like Field:ValueString.
expression : Field ':' ValueString;
Field : Letter LetterOrDigit*;
ValueString : ~[:];
Letter : [a-zA-Z];
LetterOrDigit : [a-zA-Z0-9];
WS: [ \t\r\n\u000C]+ -> skip;
假设a:b传递到语法中,a和b都被标识为Field.如何在Antlr4(C#)中解决此问题?
suppose a:b is passed in to the grammar, a and b are both identified as Field. How do I resolve this in Antlr4 (C#)?
推荐答案
您可以在词法分析器规则中使用语义谓词来进行先行(或后行)操作,而无需消耗字符(
You can use a semantic predicate in your lexer rules to perform lookahead (or behind) without consuming characters (ANTLR4 negative lookahead in lexer)
要消除歧义,可以检查Field
规则后的字符是否为:
或检查ValueString
之前的字符是否为:
.
In you case, to remove ambiguity, you can check if the char after the Field
rule is :
or you can check if the char before the ValueString
is :
.
Ï第一种情况:
expression : Field ':' ValueString;
Field : Letter LetterOrDigit* {_input.LA(1) == ':'}?;
ValueString : ~[:];
Letter : [a-zA-Z];
LetterOrDigit : [a-zA-Z0-9];
WS: [ \t\r\n\u000C]+ -> skip;
在第二个中(请注意,Field
和ValueString
的顺序已颠倒):
In the second one (please note that Field
and ValueString
order have been inversed):
expression : Field ':' ValueString;
ValueString : {_input.LA(-1) == ':'}? ~[:];
Field : Letter LetterOrDigit*;
Letter : [a-zA-Z];
LetterOrDigit : [a-zA-Z0-9];
WS: [ \t\r\n\u000C]+ -> skip;
还可以考虑将fragment
关键字用于Letter
和LetterOrDigit
Also consider using fragment
keyword for Letter
and LetterOrDigit
fragment Letter : [a-zA-Z];
fragment LetterOrDigit : [a-zA-Z0-9];
"[[带有fragment关键字],您还可以定义不是令牌的规则,而是有助于识别令牌.这些碎片规则不会导致令牌对解析器可见." (来源 https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer + Rules )
"[With fragment keyword] You can also define rules that are not tokens but rather aid in the recognition of tokens. These fragment rules do not result in tokens visible to the parser." (source https://theantlrguy.atlassian.net/wiki/display/ANTLR4/Lexer+Rules)
这篇关于如何解决简单的歧义的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!