Antlr3(C#目标)始终命中幻影EOF角色

Antlr3(C#目标)始终命中幻影EOF角色,c#,java,antlr,antlr3,C#,Java,Antlr,Antlr3,在AntlrWorks中编写Antlr3语法(生成C#)时,我编写了以下一组词法规则: array : '[' properties? ']' -> ^(ARR properties?) ; properties : propertyName (','! propertyName)* ; propertyName : ID | ESC_ID ; ESC_ID : '\'' ESC_STRING '\'' ; fra

在AntlrWorks中编写Antlr3语法(生成C#)时,我编写了以下一组词法规则:

array :
    '[' properties? ']' -> ^(ARR properties?)
    ;

properties :
    propertyName (','! propertyName)*
    ;

propertyName :
    ID
|   ESC_ID
    ;

ESC_ID :
    '\'' ESC_STRING '\''
    ;

fragment
ESC_STRING
    :   ( ESCAPE_SEQ | ~('\u0000'..'\u001f' | '\\' | '\"' ) )*
    ;
但是,每当我试图解析与
ESC_ID
规则匹配的任何字符串时,我都会在字符串的末尾命中一个幻影EOF字符:

输入:
['testing 123']


不能使用AntlWorks为C#目标生成代码。您需要使用C#端口中包含的
Antlr3.exe
工具生成C#代码。首选方法是使用MSBuild集成,该集成可以手动完成,也可以(最后!)使用NuGet自动完成

最新官方版本可在此处找到:


除此之外,我还在NuGet上发布了ANTLR 3的alpha版本。如果在Visual Studio 2010+的NuGet软件包管理器中启用“包含预发布”,您会发现它被列为ANTLR 3版本3.5.0.3-alpha002。

在某些系统上,读取文件通常会导致文件末尾出现文件结尾字符。我正在解析字符串,不是文件。EOF只是意味着它在不应该的时候结束了。。。什么是逃避?那么输入字符串是什么呢?ESCAPE_SEQ只是示例中使用的标准字符串lexer规则的一部分——我有另一个称为string的规则,它与ESC_ID完全相同,但用双引号括起来,效果很好,所以我认为这不是问题所在。我将使用输入字符串进行更新。是否有规则正在处理“[在您的输入字符串上?因为您的字符串以“我熟悉这个问题。但是,我是Linux用户,当我试图在文件上使用Mono运行.exe时,我得到了一个丑陋的堆栈跟踪,与缺少的构造函数有关。因此我使用AntlWorks的原因。@BradRoss我正在修复更新版本的错误。如果你把这个问题贴在这里,我也许可以在发布前更正它:(它可能是#4的副本,我一定会在发布前修复它。)谢谢你的建议。我刚刚添加了这个问题。我不能等到Antlr4 C#target的文档完成之后,我就可以迁移到它了。现在我正在使用C#port进行更新。