我试图为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文件和运行时。
答案 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