如何解决简单的歧义 [英] how to resolve simple ambiguity

查看:155
本文介绍了如何解决简单的歧义的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我刚开始使用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;

在第二个中(请注意,FieldValueString的顺序已颠倒):

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关键字用于LetterLetterOrDigit

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆