ANTLR 4.5.3 C#lexer无法初始化(ATN UUID错误)

时间:2016-12-14 09:03:57

标签: c# parsing antlr4 .net-core antlr4cs

我试图为C#创建我的第一个antlr4语法,并且我得到以下异常:

  

System.NotSupportedException:无法使用UUID反序列化ATN   aadb8d7e-aeef-4415-ad2b-8204d6cf042e(预计   ab35191a-1603-487e-b75a-479b831eaf6d或传统UUID)。在   Antlr4.Runtime.Atn.ATNDeserializer.Deserialize(Char [] data)

我的语法很简单,只是从表达式字符串中识别数字和标识符。我只有lexer语法,因为我想从文本中获取标记(数字和单词),没有一些AST。它在init上立即失败:

lexer = new MyLexer(new AntlrInputStream("3"));

// fails in this line in constructor: Interpreter = new LexerATNSimulator(this,_ATN);

我没有对VS使用Antlr语言支持,因为我使用 dotnet 核心,我有.xproj而不是.csproj,所以我不确定是不是支持的。但是,我认为这并没有什么不同,因为我使用命令行:

java -jar antlr-4.5.3-complete.jar -Dlanguage=CSharp MyLexer.g4

我已经添加了4.5.3 nuget包,我可以在project.json中看到该版本与jar版本相同:

"dependencies": {
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Antlr4": "4.5.3"  
}
...
}

我也试过预发布,但我得到了同样的错误。

我在java版本中发现了类似的问题:Initialising my Lexer throws an error in Antlr4 但是,它在我的C#案例中无法帮助,因为ANTLR的版本不匹配存在问题,我在这里使用4.5.3生成.cs文件和运行时。

1 个答案:

答案 0 :(得分:1)

与antlr.org发布的ANTLR版本一起分发的C#目标是我原来的C#目标的一个分支,它不会生成与我通过NuGet分发的官方C#目标兼容的C#代码。您将需要使用通过NuGet分发的代码生成器(在4.5的Antlr4包中,但在4.5.4中移动到Antlr4.CodeGenerator),然后才能在运行时工作。

另外,请记住,堆栈溢出不是我密切监视的C#目标的支持通道。在大多数情况下,如果您有问题,错误报告或增强请求,您将需要在GitHub上创建一个问题: https://github.com/tunnelvisionlabs/antlr4cs