Antlr4从错误中恢复并继续解析直到EOF

时间:2015-05-27 10:07:46

标签: antlr grammar antlr4 antlr4cs

我正在使用Antlr 4.5在Java中编写C#语法。 当我处理具有预处理器指令的C#源代码时。 示例代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hansa
{
    class Program
    {
        public static void Main()
        {
            int b = 5;
            #if true
                int c = 0;
                #if false
                            union {
                                internal struct {
                                    uint    pmclass;
                                    ushort  pmenum;
                                };
                                ushort  bseg;
                                byte[]  Sym;
                                internal struct  {
                                    uint index;
                                    string name;
                                } btype;
                            } pbase;
                #endif
                printMe(c);
            #endif
            printMe(b);
            Console.ReadLine();
        }

        public static void printMe(int val)
        {
            Console.WriteLine(val);
        }
    }
}

在上面的代码示例中," #if false"之间的代码和下一个" #endif"产生错误"输入' union没有可行的选择{'"。

我需要在代码级别忽略此错误或通过语法忽略行。

在上面的代码中,如果我没有任何错误,我可以获得命名空间名称,类名,方法名,方法签名和语句行。 当我在" union {"附近出现错误时,我能够访问命名空间名称,类名,Main()方法名称,但我无法达到printMe()方法声明。

我的要求是,当发生错误时,不应终止语法分析。它应该从下一行继续到EOF。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

您必须重写ANTLR4错误恢复。 DefaultErrorStrategy将报告NoViableAlternativeException,然后恢复。它不会中断解析。因此,如果您的程序在第一个错误中断:

  • 也许您使用其他ANTLRErrorStrategy。然后调整它,它会像DefaultErrorStrategy
  • 一样恢复
  • 或者您的ANTLRErrorListener中断了该程序,然后您必须以跳过故障的方式调整此程序。

如果您希望错误恢复从下一行开始,则必须调整方法ErrorStrategy.recoverXXX。默认情况下,错误恢复会尝试删除/插入魔法标记,以使其处于干净状态。