1

後で解析するためにASTを生成するAntlr3.4文法を開発しました。生成されたパーサーは、Antlr の C インターフェイスを使用します。パーサーが予期しないトークンに遭遇すると、追加します

「ツリー エラー ノード」を AST トークン ストリームに送信し、入力の処理を続行します。(内部的に「Tree Error Node」は ANTLR3_TOKEN_INVALID を表します。)

パーサーの出力を AST パーサーに渡すと、"Tree Error Node". ASTストリームで無効なトークンを処理する方法はありますか?

私は使用しています:

  • libantlr3c-3.4
  • antlr3.4
4

2 に答える 2

0

上記のメソッドを使用してMatch()をオーバーライドし、パーサーのリカバリを実行する必要があります(これはc#擬似コードです)。

    public override object Match(IIntStream input, int ttype, BitSet follow)
    {
        if (needs recover)
        {
            ... Recover from mismatch, i.e. skip until next valid terminal.
        }

        return base.Match(input, ttype, follow);
    }

また、不一致のトークンから回復する必要があります。

    protected override object RecoverFromMismatchedToken(IIntStream input, int ttype, BitSet follow)
    {
        if (needs recover)
        {
            if (unwanted token(input, ttype))
            {

                .. go to the next valid terminal
                .. consume as if ok
                .. return next valid token

            }

            if (missing token(input, follow))
            {
                .. go to the next valid terminal
                .. insert missing symbol and return
            }

            .. othwerwise throw
        }

        .. call base recovery(input, ttype, follow);
    }

他にご不明な点がありましたらお知らせください。

于 2013-03-07T22:42:32.883 に答える
0

ツリーアダプターメソッド「errorNode」をオーバーライドして、ユーザー指定のトークンを発行できることがわかりました。そのトークンは、AST パーサーで処理できます。

于 2013-03-07T06:33:53.270 に答える