问题标签 [antlr3]
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.
antlr - 用 Antlr3 匹配词位变体
我正在尝试使用 Antlr 3.2 和 Java1.6 匹配英文输入文本中的测量值。我有如下的词汇规则:
我希望能够接受大小写输入的任何组合,并且更重要的是,只需为 MILLIMETRE 的所有变体返回一个词法标记。但目前,我的 AST 包含“毫米”、“毫米”、“毫米”等,就像在输入文本中一样。
阅读http://www.antlr.org/wiki/pages/viewpage.action?pageId=1802308后,我认为我需要执行以下操作:
但是,当我这样做时,我在 Antlr 生成的 Java 代码中得到以下编译器错误:
我尝试了以下方法:
但随后 MEASUREMENT 不再匹配。
带有重写规则的更明显的解决方案:
导致 NPE:
将 MEASUREMENT 变成解析器规则会给我带来可怕的“以下标记定义永远无法匹配,因为先前的标记匹配相同的输入”错误。
通过创建解析器规则
我收到警告“没有对应于令牌的词法分析器规则:T_MILLIMETRE”。虽然 Antlr 运行,但它仍然给我 AST 中的输入文本,而不是 T_MILLIMETRE。
我显然还没有像 Antlr 那样看待这个世界。任何人都可以给我任何提示或建议吗?
史蒂夫
javascript - 使用 ANTLR 解析 JavaDoc 注释
我试图在我的 JavaScript 文件中解析一个特定的(本地开发的)JavaDoc 标记,但我正在努力理解如何实现这一点。Antlr 抱怨如下:
注 1:永远不能匹配以下备选方案: 1
注意 2:决策可以使用多个替代项匹配诸如“'_'..'.'”之类的输入:1、2 因此,该输入的替代项 2 被禁用
这是我要解析的内容:
所有行都应该可以解析,只有在名为“IMPORT”的 AST 树元素下创建了 @import 语句(连同它的 Maven 组:工件值)。
感谢你的协助。
java - 如何在 Antlr 分词器中进行 Unicode 转义解码
我使用 AntlrWorks 创建了一个 antlr 语法,并创建了一个供内部使用的本地化工具。我想在解析时将 unicode 转义序列转换为实际的 Java 字符,但不确定最好的方法。这是我语法中的标记定义。有没有办法为片段 UNICODE_ESC 指定一个动作,它会返回字符,而不是六个字符的转义序列?
antlr - ANTLR3 词法分析器优先级
我想从'..'
ANTLR3 词法分析器中创建一个标记,它将用于将表达式串在一起,例如
所以,我补充说,
问题是我已经有一个规则:
并且在上面的示例 [3]1..2
中被匹配为 a FLOAT
(我不知道为什么因为跟随第一个.
是另一个.
不是 INT,但它是)。
我想知道是否有一种方法可以更改词法分析器规则的优先级,以便DOTDOTSEP
先匹配,然后再匹配FLOAT
。
看这里似乎我输了,"The rule having the greatest count is the winner.",
但想知道是否有办法解决它。
PS INT 定义如下...
编辑。
进一步的测试让我觉得它并不像直接匹配FLOAT
规则那么简单。(我本来打算改变这个问题,但既然我现在有了答案,我就不会了。)问题(我相信)仍然在于词法分析器规则的优先级,所以问题仍然是一样的。
java - ANTLR 3 解析问题
我编写了一个ANTLR 3语法来解析TaskJuggler III预订文件(见下文)。
在线的
项目项目“示例项目”“1.0”2010-10-24-00:00-+0200-2010-11-23-09:00-+0100 {
我收到以下错误:
第 1:42 行不匹配的字符 '-' 期望设置 '0'..'9'
第 1:48 行不匹配的字符 ':' 期望设置 '0'..'9'
第 1:67 行不匹配的字符 '-' 期望设置为 '0'..'9'
第 1:73 行不匹配的字符 ':' 期望设置为 '0'..'9'
此后,发生OutOfMemory错误。
这是语法的相关部分:
bookingsFile 返回 [DefaultBookingsFile bookingsFile]
{bookingsFile.addSupplementStatement($suppStmt.suppStmt); }
项目标头
TJ3_BOOKING_TIME '{'
TJ3_BOOKING_TIME
'-' 数字 ':' 数字 '-' 时区
时区
问题:我做错了什么?
提前致谢
德米特里
PS:语法的完整版可在
及以下
parsing - ANTLR Lua 长字符串语法规则
我正在尝试为 Lua 创建 ANTLR 解析器。所以我采用了 Nicolai Mainero 制作的语法(可在 ANTLR 的网站上获得,Lua 5.1 语法)并开始工作。
语法很好。一件事不起作用:长字符串。
Lua 规范规则:字面量
字符串也可以使用长括号括起来的长格式来定义。我们将第 n 级的左长括号定义为一个左方括号,后跟 n 个等号,然后是另一个左方括号。因此,级别 0 的左长括号写为 [[,级别 1 的左长括号写为 [=[,依此类推。闭合长括号的定义类似;例如,第 4 级的右长括号写为]====]。长字符串以任何级别的左长括号开始,并在同一级别的第一个右长括号结束。这种括号形式的文字可以运行多行,不解释任何转义序列,并忽略任何其他级别的长括号。它们可以包含除了适当级别的右括号之外的任何内容。适当的级别。
我的问题与此接近,但工具不同。
LONGSTRING 的一些小例子:
这里我的 LONGSTRING 规则没有'='符号:
有人可以帮助我吗?谢谢!
header - 在 ANTLR 中使用 @header
我无法让“@header”或任何其他@规则在 ANTLR 中工作。用一个非常基本的语法,像这样:
这似乎符合 ANTLR 文档和其他各种在线示例,但是当我尝试通过 ANTLRWorks v1.4 或 ANTLR jar v3.2 生成输出时,出现以下错误:
无法生成语法,因为:
错误(100):[路径]\test.g:11:1 语法错误:antlr:[路径]\test.g:11:1 意外令牌:令牌 {
我似乎无法动摇。我能够在语法中不包含@header 的情况下成功生成词法分析器和解析器。我在 Windows 上有最新版本的 Java:
java 版本“1.6.0_22” Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, 混合模式, 共享)
我认为这很简单,我只是对此视而不见,所以请提出明显的答案。
antlr - 在 ANTLR 中生成简单的 AST
我正在玩一些 ANTLR,并希望创建一个这样的函数:
这会产生以下 AST:
到目前为止,我已经尝试过没有运气,并且我不断让 AST 将参数作为兄弟姐妹,而不是孩子。
到目前为止的代码:
C#:
ANTLR:
java - 为什么 ANTLR 不能以我期望的方式识别这条规则?
我正在使用 ANTLR 替换我目前拥有的现有(小型)解析器。这是我要解析的文件的片段:
这是Shared.g:
和 Pdb.g:
我的问题是,当我运行解析器时,出现以下错误:
为什么我的语法不接受“Bk”,即使它会接受“b”?我觉得我忽略了一些明显的东西。提前致谢
antlr - ANTLR 前向引用
我需要为具有前向引用的语言创建语法。我认为实现这一点的最简单方法是对生成的 AST 进行多次传递,但我需要一种将符号信息存储在树中的方法。
现在我的解析器正确地生成了一个 AST 并计算了变量和函数定义的范围。问题是,我不知道如何将范围信息保存到树中。
我的语法片段:
我想将对当前范围的引用放入树中,例如:
甚至可能吗?有没有其他方法可以将当前范围存储在生成的树中?我可以在树语法中生成范围信息,但它不会改变任何东西,因为我仍然必须将它存储在某个地方以便在树上进行第二次传递。