Antlr C解析器可以从无效令牌中恢复

时间:2013-03-05 07:53:42

标签: c antlr

我开发了一个 Antlr3.4 语法,它生成 AST 以供以后解析。生成的解析器使用Antlr的C接口。当解析器遇到意外的令牌时,它会添加

  

“树错误节点”到AST令牌流并继续处理输入。 (内部“树错误节点”表示ANTLR3_TOKEN_INVALID。)

当我将解析器的输出传递给AST解析器时,它会在"Tree Error Node"上停止。无论如何都要处理AST流中的无效令牌?

我正在使用:

  
      
  • libantlr3c-3.4
  •   
  • antlr3.4
  •   

2 个答案:

答案 0 :(得分:0)

我发现你可以覆盖树适配器方法“errorNode”来发出用户指定的令牌。然后可以在AST解析器中处理该令牌。

答案 1 :(得分: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);
    }

如果还有其他问题,请告诉我。