问题标签 [antlr]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1715 浏览

unicode - 如何在我的 Antlr 语法中添加 unicode 字符?

我正在尝试使用以下内容构建语法:

数字:整数 | 浮动 | 无限 | PI ... INFINITY: '∞' PI: 'π'

但是 Antlr 拒绝加载语法。

0 投票
6 回答
4814 浏览

ant - 我从哪里获得 Antlr Ant 任务?

我试图在我的 Ant build.xml 中调用 Antlr 任务,如下所示:

但是 Ant 找不到任务定义。我已将以下所有内容放入其中dir.lib.build

  • antlr-3.1.jar
  • antlr-2.7.7.jar
  • antlr-runtime-3.1.jar
  • stringtemplate-3.2.jar

但这些似乎都没有任务定义。(我也试过把这些罐子放在我的 Ant 类路径中;同样的问题。)

0 投票
25 回答
67418 浏览

c# - 为什么 .NET 异常没有被 try/catch 块捕获?

我正在开发一个使用 C# 的ANTLR解析器库的项目。我已经建立了一个语法来解析一些文本,并且效果很好。但是,当解析器遇到非法或意外标记时,它会抛出许多异常之一。问题是在某些情况下(不是全部)我的 try/catch 块不会捕获它,而是作为未处理的异常停止执行。

对我来说,问题是除了在我的完整代码中之外,我无法在其他任何地方复制这个问题。调用堆栈显示异常肯定发生在我的 try/catch(Exception) 块中。我唯一能想到的是,在我的代码和引发异常的代码之间发生了一些 ANTLR 程序集调用,并且这个库没有启用调试,所以我无法单步执行。我想知道不可调试的程序集是否会抑制异常冒泡?调用堆栈如下所示;外部程序集调用在 Antlr.Runtime 中:

Parse() 中最底层调用的代码片段如下所示:

对我来说,一个 catch (Exception) 子句应该已经捕获了任何异常。有什么理由不这样做吗?

更新:我用 Reflector 追踪了外部组件,没有发现任何螺纹迹象。该程序集似乎只是 ANTLR 生成代码的运行时实用程序类。抛出的异常来自 TimeDefLexer.mTokens() 方法,其类型为 NoViableAltException,它派生自 RecognitionException -> Exception。当词法分析器无法理解流中的下一个标记时,将引发此异常;换句话说,无效输入。应该会发生此异常,但是它应该已被我的 try/catch 块捕获。

此外,重新抛出 ParserException 与这种情况确实无关。这是一个抽象层,它在解析期间接受任何异常并转换为我自己的 ParserException。我遇到的异常处理问题永远不会到达那行代码。事实上,我注释掉了“throw new ParserException”部分,仍然得到相同的结果。

还有一件事,我修改了原来的 try/catch 块,改为捕获 NoViableAltException,消除了任何继承混淆。我仍然收到相同的结果。

有人曾经建议,有时 VS 在调试模式下捕获处理的异常时过于活跃,但这个问题也发生在发布模式下。

伙计,我还是很难过!我之前没有提到它,但我正在运行 VS 2008,我所有的代码都是 3.5。外部程序集为 2.0。此外,我的一些代码子类化了 2.0 程序集中的一个类。版本不匹配会导致此问题吗?

更新 2:我能够通过将 .NET 3.5 代码的相关部分移植到 .NET 2.0 项目并复制相同的场景来消除 .NET 版本冲突。在 .NET 2.0 中持续运行时,我能够复制相同的未处理异常。

我了解到 ANTLR 最近发布了 3.1。所以,我从 3.0.1 升级并重试。事实证明,生成的代码进行了一些重构,但在我的测试用例中出现了相同的未处理异常。

更新 3: 我在一个简化的 VS 2008 项目中复制了这个场景。随意下载并亲自检查该项目。我已经应用了所有很棒的建议,但还没有能够克服这个障碍。

如果您能找到解决方法,请分享您的发现。再次感谢!


谢谢,但是 VS 2008 会自动中断未处理的异常。另外,我没有 Debug->Exceptions 对话框。抛出的 NoViableAltException 完全是有意的,并且被设计为被用户代码捕获。由于未按预期捕获,因此程序执行会作为未处理的异常意外停止。

抛出的异常是从 Exception 派生的,并且 ANTLR 没有进行多线程。

0 投票
4 回答
414 浏览

antlr - 有人知道如何正确安装 ANTLR 以使用 .Net 吗?

ANTLR 可以使用 StringTemplate 或任何我希望它喜欢 Yacc/Bison 的文本输出 C#,还是只输出到 java?从我看过的例子来看,它似乎是一个非常以 java 为中心的工具。

0 投票
2 回答
6633 浏览

antlr - Antlr: Simplest way to recognize dates and numbers?

What is the simplest (shortest, fewest rules, and no warnings) way to parse both valid dates and numbers in the same grammar? My problem is that a lexer rule to match a valid month (1-12) will match any occurrence of 1-12. So if I just want to match a number, I need a parse rule like:

It only gets more complex when I add lexer rules for day and year. I want a parse rule for date like this:

I don't care if month,day & year are parse or lexer rules, just so long as I end up with the same tree structure. I also need to be able to recognize numbers elsewhere, e.g.:

0 投票
2 回答
681 浏览

exception - 如何在 ANTLR 2 中找到字符位置?

我有一个简单的语法,并使用 antlr 2.7.7 生成了一对 c# 类。当解析器发现带有令牌的错误时,它会抛出异常;我想找出令牌来的解析流中有多少字符。我怎么做?

0 投票
5 回答
46661 浏览

c++ - Antlr 的优势(相对于 lex/yacc/bison)

我过去曾在各种项目中使用过 lex 和 yacc(通常是 bison),通常是翻译器(例如流入 EDA 应用程序的 EDIF 子集)。此外,我不得不支持基于 lex/yacc 语法的代码,这些语法可以追溯到几十年前。因此,尽管我不是专家,但我知道如何使用这些工具。

过去我在各种论坛上看到过关于 Antlr 的正面评价,我很好奇我可能遗漏了什么。因此,如果您两者都使用过,请告诉我 Antlr 中哪个更好或更高级。我目前的限制是我在 C++ 商店工作,我们发布的任何产品都不会包含 Java,因此生成的解析器必须遵循该规则。

0 投票
1 回答
345 浏览

parsing - 谁能帮我把这个 ANTLR 2.0 语法文件转换成 ANTLR 3.0 语法?

我已经转换了“简单”部分(片段、@header 和@member 声明等),但是由于我是 Antlr 的新手,所以我很难转换 Tree 语句等。

我使用以下迁移指南

语法文件可以在这里找到。...

您可以在下面找到一些我遇到问题的示例:

例如,我有以下问题:

或者

0 投票
2 回答
702 浏览

antlr - 使用 AntLR 获取开始和结束位置

我目前正在使用 AntLR 用专有语言解析一些文件。我需要在编辑器上突出显示它的部分(例如,考虑突出显示 Java 类中的方法)。

有没有人提示如何获得它们?说我有这个代码:

由于函数是一个关键字,我在解析器中得到的第一个位置是标识符“test”之一。我怎样才能得到从那里到结束花括号的位置?正如人们所期望的那样,参数列表是动态的,因此您事先不知道它的长度。

谢谢!

0 投票
2 回答
1217 浏览

java - 如何在 ANTLR 中指定令牌的确切出现次数?

我必须定义一个文件的语法,如下所示。

//示例文件
NameCount = 4
Name = a
Name = b
Name = c
Name = d
//文件结束

现在我可以为NameCountName定义标记。但是我必须定义文件结构,包括令牌Name的有效实例数,这是NameCount之后的值。我将值解析并转换为整数并存储在语法全局范围内的变量中(比如变量nc)。

如何在语法中定义Name应该精确重复nc次?