我正在使用 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。
我怎样才能做到这一点?
您将必须重写 ANTLR4 错误恢复。DefaultErrorStrategy
将报告NoViableAlternativeException
然后恢复。它不会中断解析。因此,如果您的程序因第一个错误而中断:
- 也许你用另一个
ANTLRErrorStrategy
。然后调整一下,让它恢复像DefaultErrorStrategy
- Or your
ANTLRErrorListener
中断程序,那么您将必须以跳过失败的方式调整此程序。
如果您希望错误恢复确实从下一行开始,则必须调整方法ErrorStrategy.recoverXXX
。默认情况下,错误恢复尝试删除/插入魔法令牌,以达到干净的状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)