1

我已经开始学习 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# 类,我会发布它们,但它们很长,所以我会推迟到有人请求它们。谢谢你。

4

2 回答 2

4

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

parser.TraceDestination = Console.Out;

于 2012-02-24T02:31:57.743 回答
1

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

当您使用 ANTLRWorks 时,如果内存对我有用,org.antlr.Tool则用于生成CSharp3 运行时(有时?)存在问题的ExprLexer.cs和类。ExprParser.cs

尝试使用该工具生成.cs源文件: http ://www.tunnelvisionlabs.com/downloads/antlr/antlr-dotnet-tool-3.4.1.9004.7z(请注意,tunnelvisionlabs.com 来自CSharp3 目标的作者) .Antlr3.exe

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

于 2011-12-15T19:07:43.677 回答