不匹配时lexing和解析模式时的输入

时间:2014-11-19 21:19:54

标签: c# antlr4

我遇到输入不匹配的ANTLR4问题但无法解决问题。我发现了许多与此有关的问题,通常围绕词法分析器匹配其他东西与令牌,但我不会在我的情况下看到它。

我有这个lexer语法:

FieldStart              :   '[' Definition ']'          ->  pushMode(INFIELD)   ;
Definition              :   'Element';
mode INFIELD;
FieldEnd                :   '[end]'                     ->  popMode             ;
ContentValue            :   ~[[]*                                               ;

然后在以下解析器上运行:

field           :   FieldStart  ContentValue FieldEnd               #Field_Found;

我简化了它以放大问题,但这是我无法再进一步的地方。

我在以下输入上运行它:

[Element]Va-lu*e[end]

我得到了这个输出:

Type : 001 | FieldStart | [Element]
Type : 004 | ContentValue | Va-lu*e
Type : 003 | FieldEnd | [end]
Type : -001 | EOF | <EOF>


([] [Element] Va-lu*e [end])

我使用C#生成输出,执行以下操作(缩短):

            string tokens = "";
            foreach (IToken CurrToken in TokenStream.GetTokens())
            {
                if (CurrToken.Type == -1)
                {
                    tokens += "Type : " + CurrToken.Type.ToString("000") + " | " + "EOF" + " | " + CurrToken.Text + "\n";
                }
                else
                {
                    tokens += "Type : " + CurrToken.Type.ToString("000") + " | " + Lexer.RuleNames[CurrToken.Type - 1] + " | " + CurrToken.Text + "\n";
                }
            }
            tokens += "\n\n" + ParseTree.ToStringTree();

通过

进行解析
IParseTree ParseTree = Parser.field();

我遇到了这个错误:

"mismatched input 'Va-lu*e' expecting ContentValue"

我只是找不到错误,你能在这帮我吗? 我认为它与词法分析器模式有关,但据我所知,解析器看起来并不关心(或知道)模式。

谢谢!

2 个答案:

答案 0 :(得分:1)

模式在组合语法中不可用。拆分你的语法,它应该工作。

另外,请务必查看错误消息:

错误(120):../ Field.g4:14:5:lexical模式只允许在词法分析器语法中

答案 1 :(得分:0)

我想我现在已经想出如何解决我的问题,在使用拆分的Lexer / Parser语法结构并使用Visual Studio(2012和2013测试)中的Lexer模式和ANTRL4 NuGet时,似乎需要配置释放:

我必须包括

&#13;
&#13;
options {	tokenVocab = GRAMMAR_NAME_Lexer;	}
&#13;
&#13;
&#13;

在开头的解析器语法中。

否则,词法分析器会按预期创建标记和模式,但解析器将无法识别处于其他模式但默认模式的词法分析器标记。

我也经历过&#34; popMode&#34; lexer命令有时会导致我的TokenStream抛出无效状态异常,我可以使用&#34;模式(DEFAULT_MODE)&#34;来解决这个问题。而不是&#34; popMode&#34;。

我希望这对某些人有所帮助,但我仍然喜欢,如果了解ANTLR的人可以提供一些额外的澄清,因为我只是解决了#34;通过玩弄它直到它起作用。