我正在使用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。
我怎样才能做到这一点?
答案 0 :(得分:1)
您必须重写ANTLR4错误恢复。 DefaultErrorStrategy
将报告NoViableAlternativeException
,然后恢复。它不会中断解析。因此,如果您的程序在第一个错误中断:
ANTLRErrorStrategy
。然后调整它,它会像DefaultErrorStrategy
ANTLRErrorListener
中断了该程序,然后您必须以跳过故障的方式调整此程序。如果您希望错误恢复从下一行开始,则必须调整方法ErrorStrategy.recoverXXX
。默认情况下,错误恢复会尝试删除/插入魔法标记,以使其处于干净状态。