为什么 C# 的 antlr 生成代码会抛出不存在的异常

why does antlr for c# generate code throw non existentexception

ANTLR4 4.7.1 在 parse.cs 文件中生成一行

throw new RuntimeException("UNEXPECTED_CHAR=" + (_localctx._UNEXPECTED_CHAR!=null?_localctx._UNEXPECTED_CHAR.Text:null));

不存在异常。通过手动编辑生成的代码很容易修复,但是每次迭代语法编辑都必须这样做有点烦人。

像这样使用内置的 C# 支持

java -jar c:\tools\antlr-4.7.1-complete.jar -Dlanguage=CSharp -visitor SQLite.g4

该行不是来自 ANTLR,而是来自您正在使用的语法文件。

假设您使用的是 SQLite.g4 from the grammars-v4 repository,罪魁祸首是第 37-42 行的 error 规则:

error
 : UNEXPECTED_CHAR 
   { 
     throw new RuntimeException("UNEXPECTED_CHAR=" + $UNEXPECTED_CHAR.text); 
   }
;

所以你可以通过编辑语法来解决这个问题,要么包含 C# 代码而不是 Java 代码,要么根本不包含任何嵌入式代码(只删除 error 应该没问题规则(以及使用它的一个实例)。