【问题标题】:ANTLR Not Emitting Error Messages on Invalid InputANTLR 在无效输入时不发出错误消息
【发布时间】:2011-12-15 18:42:20
【问题描述】:

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

【问题讨论】:

  • 不会出错的输入是什么?
  • 我没有收到任何无效输入的错误。我试过像“3+@”这样的东西,没有错误。 "(3" 也不会导致错误。看来它不是导致它的特定类型的异常。

标签: antlr antlr3 antlrworks


【解决方案1】:

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

parser.TraceDestination = Console.Out;

【讨论】:

    【解决方案2】:

    我只使用过 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 目标不熟悉,我没有对此进行测试,但值得一试。

    【讨论】:

    • 我已经尝试过了,但我仍然得到相同的结果。我想我会尝试回滚到 ANTLR 的早期版本,看看是否能解决它。感谢您的建议。
    • 嗯,我已经回滚到 ANTLR 3.1.1 并且收到错误消息,所以它似乎正在工作,尽管与我的预期不完全一样。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多