问题标签 [grammar-kit]

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 回答
379 浏览

java - IntelliJ 中是否存在类似 ASTNode 标识符的东西

我正在为IntelliJ Idea编写一个插件,现在我需要一个类似ASTNode Identifier的东西,它对于 AST 中的每个节点都必须是唯一的。

我应该使用什么?

0 投票
1 回答
1639 浏览

intellij-idea - 自定义语言的 BNF 规则语法高亮

我正在尝试使用 Grammar-Kit 插件为 IntelliJ 开发自定义语言插件。我可以轻松地为定义的标记提供语法突出显示,但我无法弄清楚如何在元素或标记父级别突出显示。

这是一个快速而肮脏的示例语言 - https://github.com/carymrobbins/intellij-plugin-example

解决方案

正如@ignatov 建议的那样,扩展 Annotator 类并将其注册到您的plugin.xml. 在下面的示例中,我们command通过定义visitCommand方法来突出显示元素。

0 投票
0 回答
261 浏览

comma - 如何从 Grammar-Kit 中的表达式中排除逗号运算符?

我正在为包含逗号运算符的 C 派生语言编写 IntelliJ 语言插件。我正在使用 Grammar-Kit 来生成解析器。在正式语法有很多嵌套表达式产生的地方,我使用Grammar-Kit 的基于优先级的表达式解析重写了它们,所以我的表达式产生如下所示:

这本身很好用,但是在语法中有些地方我需要解析不能是逗号表达式表达式。函数调用就是这样的一个例子:

函数参数不能是逗号表达式,因为用逗号分隔下一个参数会产生歧义。(在我现在的语法中,它总是解析为单个逗号表达式。)形式语法通过指定每个函数参数必须是一个赋值表达式来处理这个问题,因为它们的赋值表达式包括所有具有更严格优先级的表达式。这不适用于 Grammar-Kit 基于优先级的语法,因为赋值表达式确实必须包含赋值。

这同样适用于初始化程序,在这种情况下,允许逗号表达式会导致在int x=1, y;.

我应该如何处理这种情况?我想继续使用基于优先级的解析来保持浅 PSI 树,但也要避免手动重写 PSI 树以进行函数调用以将 aCommaExpression转换为参数列表。

0 投票
1 回答
755 浏览

intellij-plugin - 在没有左递归的情况下重写解析表达式语法(PEG)

使用https://github.com/JetBrains/Grammar-Kit如何在没有左递归的情况下重写语法?

样本输入:

答案应维护节点包含 2/3 个子节点的解析树属性: 在此处输入图像描述

0 投票
2 回答
209 浏览

recursion - 在解析 LiveScript 对象定义时避免左递归

我正在开发 LiveScript 语言的解析器,并且无法同时解析这两种对象属性定义key: value表单(+|-)key。例如:

我有这个key: value表格:

但是,无论我尝试添加("+"|"-") IDENTIFIERor PropDefExpressionObjDefExpression我都会收到有关使用左递归的错误。这样做的(正确)方法是什么?

0 投票
0 回答
84 浏览

parsing - 解析 Elm 案例表达式与函数调用冲突

我正在使用 JFlex 和 Grammar Kit 为 Elm 语言开发一个 Intellij 插件。我编写解析器的经验很少。

我无法解析 case 表达式,因为它们与函数调用发生冲突。

BNF 规范如下:

在以下示例中,解析器无法识别 84 是新 case_body_part 的开始

如果有人知道语法工具包,我将不胜感激。但是,假设观众通常更可能知道解析器:
1)我可以用更好的 BNF 解决这个问题吗?
2)涉及到什么样的解析概念。
3) 你能否指出另一个解析器(如 yacc)如何处理这个问题。

0 投票
1 回答
125 浏览

intellij-idea - 如何使用 BNF 表示小写字母后跟任何大小写字符?

我正在尝试了解 IntelliJ Grammar Kit 如何用于创建 BNF

如何定义一个以'v'为星号的标识符,然后有任何大小写。例如“vModule”。

这是我的尝试:

但是,它需要“v Module”而不是“vModule”。

0 投票
1 回答
729 浏览

intellij-idea - 如何使用 Grammar-Kit 编写 BNF 规则

我正在尝试将 EBNF 文件转换为适用于 IntelliJ Grammar-kit 的 BNF。

在 EBNF 中有这样的规则:

如何在不使用正则表达式的情况下创建这样的规则?原因是这种构造经常发生,并且在正则表达式中变得重复。

需要明确的是,我希望能够创建一个匹配@@fromBinOpChar但不匹配的规则@ @。那可能吗?

0 投票
1 回答
810 浏览

parsing - IntelliJ:Grammar-Kit / BNF:如何从错误中恢复?

我正在为 IntelliJ 编写自定义语言插件。

这是该语言的简化示例。请注意,该结构是递归的:

在此处输入图像描述

我已经成功实现了 FLEX 和 BNF 文件,但我不确定如何添加错误恢复。我在 Grammar-Kit 的 HOWTO 中阅读了有关RecoverWhilepin的信息,但我不确定如何将它们应用到我的场景中。

我将上面的棕色项目(“aaa”、“ccc”等)称为“项目”。

我称黄色的(“bbb”、“ddd”、...)为“属性”。

每个项目都有一个项目名称(例如“aaa”)、一个属性(例如“bbb”),并且可以包含其他项目(例如“aaa”包含“ccc”、“eeee”和“gg”)。

目前,当项目格式错误时,插件表现不佳。例如:

在此处输入图像描述

在本例中,我希望解析器“理解”“ccc”是缺少属性的项目的名称(例如,通过在右括号前检测换行符)。

我不希望损坏的“ccc”项目影响“eeee”的解析(但我确实希望 PSI 树具有文本中存在的“ccc”元素,在这种情况下 - 它的名称)。

这是我使用的 FLEX 和 BNF:

柔性:

BNF:

0 投票
1 回答
122 浏览

intellij-plugin - 如何更改 Grammar-Kit 生成的 lexer Java 文件生成的路径?

如何更改 Grammar-Kit 生成的 JFlex lexer Java 文件的生成路径?

我已经询问了Grammar-Kit 的问题跟踪器,但没有收到任何回复。

我厌倦了没有将词法分析器放入我生成的文件目录中(我可以轻松地将其与所有其他生成的文件一起删除,并将其从搜索中排除,以及 IDE 警告等)。