一千萬個為什麽

搜索

在使用模式解析和解析時,輸入不匹配

我遇到了輸入不匹配的ANTLR4問題,但無法解決問題。我發現了很多問題,並且通常圍繞詞法分析器將其他事物與令牌進行匹配,但我沒有看到它。

我有這個詞法分析器:

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 | 


([] [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"

我只是沒有發現錯誤,你能幫我嗎? 我認為這與詞法分析模式有關,但從我看來,它看起來像解析器不關心(或知道)模式。

謝謝!

最佳答案

我想現在我已經想出了如何解決我的問題,在使用分離的詞法分析器/分析器語法結構並且在Visual Studio中使用Lexer模式(2012和2013版測試)和ANTRL4 NuGet版本似乎需要配置:

我必須包括

<div class="snippet" data-lang="js" data-hide="true"> <div class="snippet-code snippet-currently-hidden">

options {   tokenVocab = GRAMMAR_NAME_Lexer;        }
</div> </div>

在我的解析器語法開頭。

否則,詞法分析器確實會按照預期創建令牌和模式,但解析器不會識別處於其他模式但默認模式的詞法分析符號。

我也經歷過“popMode”lexer命令有時會導致我的TokenStream拋出無效狀態異常,我可以使用“mode(DEFAULT_MODE)”而不是“popMode”來解決這個問題。

我希望這有助於某人,但我仍然希望,如果有人了解ANTLR可以提供一些額外的澄清,因為我只是通過四處尋找“解決”它,直到它工作。

轉載註明原文: 在使用模式解析和解析時,輸入不匹配