问题标签 [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 投票
3 回答
1572 浏览

antlr - 如何在 ANTLR 中构建一个干净的、类似于 Python 的语法?

天!

如何构建一个简单的 ANTLR 语法来处理多行表达式而不需要分号或反斜杠?

我正在尝试为表达式编写一个简单的 DSL:

总的来说,我希望我的应用程序为脚本提供一些初始命名值并提取最终结果。但是,我对语法很感兴趣。我想支持多行表达式,如下所示:

我从这样的 ANTLR 语法开始:

看起来很简单,但我已经遇到了换行的麻烦:

以图形方式,在 org.antlr.works.IDE 中:

决策可以使用多种选择匹配 NL http://img.skitch.com/20090723-ghpss46833si9f9ebk48x28b82.png

我已经踢了语法,但总是以违反预期行为而告终:

  • 文件末尾不需要换行符
  • 空行是可以接受的
  • 从井号开始的一行中的所有内容都被丢弃为注释
  • 作业以换行符结尾,而不是分号
  • 如果用括号括起来,表达式可以跨越多行

我可以找到具有许多这些特征的示例 ANTLR 语法。我发现当我削减它们以将它们的表现力限制在我需要的范围内时,我最终会破坏某些东西。其他的太简单了,我在添加表现力的同时打破它们。

我应该从哪个角度来理解这个语法?你能指出任何不是琐碎或完整的图灵完备语言的例子吗?

0 投票
5 回答
261 浏览

html - 希望创建输出 HTML 的自定义域特定语言

我正在寻找创建自己的自定义域特定语言来输出 HTML。

基本上,我希望能够使用我自己的标记创建测验,但将其编译/生成为 HTML。例如:

应该输出

我知道 ANTLR 做了类似的事情,但没有 HTML 输出。还有其他建议吗?

0 投票
1 回答
885 浏览

c# - 是否有任何好的教程描述如何使用 ANTLR 解析布尔搜索字符串

我需要将关键字和运算符的布尔搜索字符串解析为要从 C# 代码执行的 SQL 查询。我认为我需要像 ANTLR 这样的东西来完成这项任务,但我不知道该怎么做。

有没有关于如何做到这一点的好教程?或者也许我需要一个不同的工具?

我的意思的一个例子如下。我需要的唯一运算符是 AND 和 OR。我也希望能够使用括号。

输入表达式:(蓝色和绿色)或黄色

输出:

SELECT * FROM table WHERE (CONTAINS(Description, "blue") AND CONTAINS(Description, "green")) OR >CONTAINS(Description, "yellow"

如果可能的话,我还想支持隐式 AND 插入。因此,如果未指定任何运算符,则默认运算符为 AND。

输入:绿色(蓝色或黄色)

输出: SELECT * FROM table WHERE CONTAINS(Description, "green") AND (CONTAINS(Description, "blue") OR >CONTAINS(Description, "yellow"))

0 投票
3 回答
2872 浏览

return-value - 在 ANTLR 中处理多个返回值

我在 ANTLR 中有一个简单的规则:

title_args 为:

尝试编译时,我遇到了标题规则中的 127 错误:title_args is a non-unique reference。

我已经按照本网站中另一个类似问题的解决方案(如何处理 ANTLR 中的列表返回值)但是它似乎只适用于词法规则。

有没有特定的方法可以绕过它?

谢谢你,克里斯托斯

0 投票
5 回答
3213 浏览

c# - 如何操作 C# AST?

我正在从事一个逆向工程学校项目,该项目需要翻译已编译 C# 项目的操作 AST。我看过关于“将 C# 代码翻译成 AST?”的帖子。在这个网站上,但它看起来不像我要找的那个。

据我所知,目前 C# 没有为 Java 提供类似的库类:http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.cdt.doc。 isv/reference/api/org/eclipse/cdt/core/dom/ast/ASTVisitor.html。如果C#中有这样的库类,这里的一切都解决了。

我已经咨询了某人,这里是可能的解决方案。但是我在制定解决方案时也遇到了问题:

  1. 找到另一个提供库的编译器,该库允许公开其 AST 以进行操作。但是我找不到这样的编译器。
  2. 使用 ANTLR Parser Generator 来制作我自己的编译器(这将是一个更加困难和更长的过程)。那里的下载提供了不同语言的示例语法,但不提供 C#(它有用各种语言编写的语法,包括 C#,但不生成 C# 语法)。因此问题是我找不到 C# 语法。

解决此问题的最短和最快方法是什么?如果我真的必须采取上述替代方案之一,我应该如何解决我面临的这些问题。

0 投票
1 回答
69 浏览

antlr - 生成代码以更正指定包的目录

我正在使用 ANTLRWorks,并使用 @header 操作指定了我的 java 包:

@header {包 com.xxx.xxx.xxx.compiler}

但是,当我生成java代码时,它是生成到根src目录而不是src/com/xxx/xxx/xxx/compiler。因此,它不能干净地编译。

如何指定正确的目录来生成代码?

0 投票
5 回答
12145 浏览

.net - .NET 的好的解析器生成器(想想 lex/yacc 或 antlr)?只有构建时间?

.NET 是否有一个好的解析器生成器(想想 lex/yacc 或 antlr)?任何拥有不会吓到律师的执照的人?很多 LGPL,但我正在研究嵌入式组件,一些组织对我采用 LGPL 依赖项感到不舒服。

我听说 Oslo 可能会提供此功能,但我不确定它是构建时间依赖还是运行时依赖。谁能澄清奥斯陆将提供什么?

更新
我真正想要的是一个解析器生成器,它是一个仅构建时间的依赖项。看起来 ANTLR 有一个运行时组件。

0 投票
1 回答
1702 浏览

parsing - Antlr 树重写规则

我正在尝试解析类似 的表达式a IN [3 .. 5[,其中尖括号的方向确定区间是包含还是不包含。我希望将其重写为类似 AST

其中 NODE-TYPE 是 BTW_INCLUSIVE、BTW_EXCL_LOWER、BTW_EXCL_UPPER 或 BTW_EXCL_BOTH 之一,具体取决于尖括号的方向。

我有以下解析规则:

这有效,只是它没有创建正确的树节点类型。如何根据匹配的内容选择要创建的节点类型?

0 投票
3 回答
4175 浏览

c# - 使用 ANTLR 构建自己的 C# 编译器:编译单元

我可以用 compiler_unit_return 类型的 x 做什么来提取它的根、它的类、它的方法等?我必须将其适配器提取出来吗?我怎么做?请注意,compile_unit_return 在我的 CSParser(由 ANTLR 自动生成)中是这样定义的:

但是我得到的树是对象类型。我使用调试器运行,似乎看到它属于 BaseTree 类型。但是BaseTree是一个接口!我不知道它与 BaseTree 有什么关系,也不知道如何从这棵树中提取细节。

我需要编写一个访问者,它访问了它的类、方法、变量等。 ParserRuleReturn 类从 RuleReturnScope 扩展并有一个开始和停止对象,我不知道它是什么。

此外,ANTLR 提供的 TreeVisitor 类看起来令人困惑。它需要一个适配器作为参数传递给它的构造函数(如果没有,它将使用默认的 CommonTreeAdaptor),这就是为什么我询问如何获取适配器早期的原因。还有其他问题。API可以参考http://www.antlr.org/api/CSharp/annotated.html

0 投票
4 回答
1875 浏览

css - 用 ANTLR 解析 CSS - 边缘情况

我正在尝试使用 ANTLR 解析 CSS,或者至少是基础知识。不过,我的词法分析器规则遇到了一些问题。问题在于 ID 选择器和十六进制颜色值之间的歧义。为了清楚起见,使用简化的语法,考虑以下输入:

以及以下解析器规则:

和这些词法分析器标记:

这不起作用,因为#bbb 被标记为颜色标记,即使它应该是一个选择器。如果我将选择器更改为不以十六进制字符开头,它可以正常工作。我不知道如何解决这个问题。有没有办法告诉 ANTLR 仅将特定标记视为颜色标记(如果它位于某个位置)?比如说,如果它在属性规则中,我可以安全地假设它是一个颜色标记。如果不是,则将其视为选择器。

任何帮助,将不胜感激!


解决方案:原来我试图在语法中做太多事情,我可能应该在使用 AST 的代码中处理。CSS 有太多模棱两可的标记,无法可靠地拆分成不同的标记,所以我现在使用的方法基本上是标记特殊字符,如'#'、'.'、':' 和花括号,并在消费者代码。效果更好,并且更容易处理边缘情况。