我已经开始学习ANTLR以便将来实现特定于域的语言(DSL)。我已经购买了The Definitive ANTLR Reference并开始研究它,以便熟悉程序和语言/编译器设计的概念。我已经成功地在我的环境中完成了所有工作(Visual Studio 2010和C#),并且我已经成功地创建了一些基本的语法,如本书所述。可以在此处找到java的源代码:http://pragprog.com/titles/tpantlr/source_code
然而,在完成第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 :(得分:4)
在对3.4.1.9004源代码进行一些调试之后,我发现traceDestination属性为null。因此,我在Main()中设置了如下所示的属性,并在控制台上显示了开始显示的消息。
parser.TraceDestination = Console.Out;
答案 1 :(得分:1)
我只使用了CSharp2目标(和运行时),因为我无法使用MonoDevelop在我的Ubuntu机器上运行CSharp3目标。
当您使用ANTLRWorks时,org.antlr.Tool
用于生成ExprLexer.cs
和ExprParser.cs
类,如果内存对我有好处,CSharp3运行时(有时?)会出现问题。
尝试使用.cs
工具生成Antlr3.exe
源文件:http://www.tunnelvisionlabs.com/downloads/antlr/antlr-dotnet-tool-3.4.1.9004.7z (请注意,tunnelvisionlabs.com来自CSharp3目标的the author)< / em>的
我没有对此进行过测试,因为我对CSharp3目标不熟悉,但值得一试。