ANTLR未在无效输入上发出错误消息

ANTLR未在无效输入上发出错误消息,antlr,antlr3,antlrworks,Antlr,Antlr3,Antlrworks,我已经开始学习ANTLR,以便将来实现领域特定语言(DSL)。我已经购买了权威的ANTLR参考资料,并开始通过它来熟悉程序和语言/编译器设计的概念。我已经成功地在我的环境(VisualStudio2010和C#)中实现了所有功能,并且我已经成功地创建了一些基本语法,如本书所述。java的源代码可以在这里找到: 然而,在阅读第3章时,我遇到了一个问题,涉及到类没有向控制台发出错误,正如书中所示。我使用的语法与书中使用的语法相同,因此我假设它与C#runtimes有关。我目前正在使用ANTLRWor

我已经开始学习ANTLR,以便将来实现领域特定语言(DSL)。我已经购买了权威的ANTLR参考资料,并开始通过它来熟悉程序和语言/编译器设计的概念。我已经成功地在我的环境(VisualStudio2010和C#)中实现了所有功能,并且我已经成功地创建了一些基本语法,如本书所述。java的源代码可以在这里找到:

然而,在阅读第3章时,我遇到了一个问题,涉及到类没有向控制台发出错误,正如书中所示。我使用的语法与书中使用的语法相同,因此我假设它与C#runtimes有关。我目前正在使用ANTLRWorks生成lexer/parser,并且正在使用CSharp3的3.4 ANTLR发行版运行时(Antlr3.Runtime.dll和Antlr4.StringTemplate.dll)

这是一个已知的问题吗?如果不是,我是否应该尝试使用较旧版本的运行时或AntlWorks

我使用的语法是:

grammar Expr;

options
{
   language = CSharp3;
}

prog    :   stat+ ;

stat    :   expr NEWLINE
|   ID '=' expr NEWLINE
|       NEWLINE
;

expr    :   multExpr (('+'|'-') multExpr)*
;

multExpr 
:   atom('*' atom)*
;

atom    :   INT
|   ID
|   '(' expr ')'
;

ID  :   ('a'..'z'|'A'..'Z')+ ;
INT :   '0'..'9'+ ;
NEWLINE :   '\r'? '\n';
WS  :   (' '|'\t')+ {Skip();};

如果有人需要看C#类,我会发布它们,但它们很长,所以我会等到有人要求时再发布。谢谢。

我只使用了CSharp2目标(和运行时),因为我无法在我的Ubuntu机器上使用MonoDevelop运行CSharp3目标

当您使用AntlWorks时,使用
org.antlr.Tool
来生成
ExprLexer.cs
ExprParser.cs
类,如果内存足够的话,CSharp3运行时(有时?)会遇到这些类的问题

尝试使用
Antlr3.exe
工具生成
.cs
源文件:(注意,tunnelvisionlabs.com是CSharp3目标的源文件)


我没有测试过这个,因为我不熟悉CSharp3目标,但值得一试。

我只使用过CSharp2目标(和运行时),因为我无法使用MonoDevelop在我的Ubuntu机器上运行CSharp3目标

当您使用AntlWorks时,使用
org.antlr.Tool
来生成
ExprLexer.cs
ExprParser.cs
类,如果内存足够的话,CSharp3运行时(有时?)会遇到这些类的问题

尝试使用
Antlr3.exe
工具生成
.cs
源文件:(注意,tunnelvisionlabs.com是CSharp3目标的源文件)


由于我对CSharp3目标不熟悉,所以我还没有对此进行测试,但值得一试。

在对3.4.1.9004源代码进行调试后,我发现traceDestination属性为null。因此,我在Main()中设置了如下所示的属性,消息开始显示在控制台上


parser.TraceDestination=Console.Out

在对3.4.1.9004源代码进行调试后,我发现traceDestination属性为null。因此,我在Main()中设置了如下所示的属性,消息开始显示在控制台上


parser.TraceDestination=Console.Out

什么是你没有得到错误的输入?我没有得到任何无效输入的错误。我尝试过“3+@”之类的方法,没有出错。“(3”也不会导致任何错误。似乎不是特定类型的异常导致了错误。什么是您没有得到错误的输入?我没有得到任何无效输入的错误。我尝试过“3+@”之类的操作,没有错误。”(3)也不会导致错误。似乎不是特定类型的异常导致了错误。我已经尝试过了,但仍然得到了相同的结果。我想我会尝试回滚到ANTLR的早期版本,看看这是否能解决问题。感谢您的建议。我已经回滚到ANTLR 3.1.1,并且收到了错误消息,因此,它似乎正在工作,尽管不是我所期望的那样。再次感谢您的帮助。我已经尝试了一下,但仍然得到了相同的结果。我想我会尝试回滚到ANTLR的早期版本,看看这是否解决了问题。感谢您的建议。我已经回滚到ANTLR 3.1.1,并且收到了错误消息,所以它似乎在工作,尽管不是我所期望的那样。再次感谢你的帮助。