2011-12-15 36 views
1

我已经开始学习ANTLR以便将来实现特定于域的语言(DSL)。我已经购买了最终ANTLR参考资料,并已开始按照自己的方式工作,以熟悉程序和语言/编译器设计的概念。我已经成功地获得了在我的环境(Visual Studio 2010和C#)中工作的所有内容,并且我已经成功地创建了一些基本语法,如本书所述。 java的源代码可以在这里找到:http://pragprog.com/titles/tpantlr/source_codeANTLR不会在无效输入上发出错误消息

但是,虽然在第3章的工作中,我遇到了一个问题,涉及类没有向控制台发出错误,如本书所示。我使用的是本书中使用的相同语法,因此我认为它与C#运行时间有关。我目前使用ANTLRWorks来生成词法分析器/解析器,并且我正在使用CSharp3的3.4 ANTLR分发运行时(Antlr3.Runtime.dll和Antlr4.StringTemplate.dll)。

这是一个已知的问题?如果不是,我应该尝试使用旧版本的运行时还是ANTLRWorks?

我使用的语法:

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#类,如果有人需要看到他们,但他们都非常长,所以我会推迟,直到有人要求他们。谢谢。

+0

什么是你不会得到错误的输入? –

+0

我没有收到任何无效输入错误。我尝试了诸如“3 + @”之类的东西,没有错误。 “(3”也导致没有错误,看来它不是一个特定类型的异常导致它。 – almostProgramming

回答

1

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

当您使用ANTLRWorks,该org.antlr.Tool用于生成ExprLexer.csExprParser.cs班,CSharp3运行时具有(有时?)有问题,如果没有记错我很好。

尝试使用Antlr3.exe工具,而不是产生.cs源文件:http://www.tunnelvisionlabs.com/downloads/antlr/antlr-dotnet-tool-3.4.1.9004.7z(注意,tunnelvisionlabs.com从CSharp3目标the author

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

+0

我已经给了这个尝试,但我仍然得到相同的结果。尝试回滚到ANTLR的早期版本,看看是否能解决它。谢谢你的建议。 – almostProgramming

+0

嗯,我已经回到了ANTLR 3.1.1,我收到了错误消息,所以它似乎工作,虽然不完全正确我的期待如何,再次感谢您的帮助 – almostProgramming

+0

不客气,虽然我觉得我没有太多的帮助:)。 –

4

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

parser.TraceDestination = Console.Out;

相关问题