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

syntax-highlighting - 将我的 .g4 转换为 .flex 和 .bnf 用于 IDEA 语法荧光笔

我以前从未使用过 JFlex,也不知道它是如何工作的。基本上,我已经为 Java 中的方案式语言构建了一个运行时,并且我拥有的解析器是使用 Antlr 4 生成的,所以我有一个 .g4 文件,如下所示:

一些例子(这样你就可以感受一下语法)。

  1. (+ 1 2)= 3

  2. ((\ a b (+ a b)) 1 2)= 3

  3. (+ "Hello, " "World")=“你好,世界”

我想要做的是使用本指南为 IntelliJ-IDEA 构建一个语法高亮插件:http: //www.jetbrains.org/intellij/sdk/docs/tutorials/custom_language_support_tutorial.html

这是我的 .flex 文件

这是我的 .bnf 文件

当我运行它时,我基本上什么都没有得到。

在此处输入图像描述

出于某种原因,仅突出显示字符串。

在此处输入图像描述

PsiViewer 看起来像这样:

在此处输入图像描述

有没有人看到为什么这不起作用的任何解释?

0 投票
1 回答
98 浏览

jetbrains-ide - 如何在 Grammar-Kit 中定义结构化数据类型?

我想定义一个像这样的结构/级联的领域特定语言(DSL)

据我了解,它需要以下规则:

  • ROOT 和 TODO 对象必须以它们的关键字开头并以 END 结尾。
  • ROOT 必须具有 NAME 属性。
  • TODO 必须有 DESC 属性
  • TODO 在 ROOT 中是 0..n 次

如何在 BNF 中表达这样的规则集?

0 投票
1 回答
770 浏览

vhdl - 词法分析 VHDL ' (tick) 标记

在 VHDL 中,' 字符可用于封装字符标记ie '.',也可以用作属性分隔符(类似于 CPP 的 :: 标记)ie string'("hello")

解析包含字符的属性名称时会出现问题ie string'('a','b','c')。在这种情况下,一个天真的词法分析器会错误地将第一个字符标记'('为一个字符,并且所有后面的实际字符都会被弄乱。

从 2007 年开始,comp.lang.vhdl google 组中有一个线程,它提出了一个名为“Lexing the ' char”的类似问题 ,该问题由用户 digratia 回答

请参阅问题报告 IR1045: http ://www.eda-twiki.org/isac/IRs-VHDL-93/IR1045.txt

从上面的代码片段可以看出,最后一个标记可以被捕获并用来区分类似的东西:

没有大的向前看或回溯。

但是,据我所知, flex 不会跟踪被解析的最后一个标记。

无需手动跟踪最后解析的标记,是否有更好的方法来完成此词法分析任务?

如果有帮助,我正在使用 IntelliJ GrammarKit。

0 投票
1 回答
159 浏览

intellij-plugin - 如何通过语法结构生成自动完成?

我配置了结构化语言的语法,现在想要对自动完成行为进行编码。有没有办法根据这样定义的语法生成它?

在 ROOT 之后点击自动完成热键应该建议 END、NAME 和 TITLE - 这在语法中明确定义

这是完整语法的链接:https ://raw.githubusercontent.com/dnltsk/intellij-mapfile-plugin/master/src/org/dnltsk/mapfileplugin/Mapfile.bnf

0 投票
1 回答
572 浏览

intellij-idea - Grammar-Kit:如何处理评论标记

从为语法工具包提供的文档中,我无法弄清楚我应该如何正确处理评论之类的东西。我的词法分析器当前返回TokenType.WHITE_SPACE任何注释块,但是没有IElementType生成唯一性供我进行语法突出显示。

如果我创建一个IElementType并告诉 flex 返回它以供注释,我可以执行语法突出显示,但是那个标记不是我在 BNF 中的语言规范的一部分,因此它被认为是无效的。

将注释作为空格传递的正确方法是什么,但在 Intellij/grammar-kit/jflex 中对它们执行语法高亮显示?

0 投票
1 回答
198 浏览

intellij-idea - Grammar-Kit 中的负前瞻

有没有办法在 Grammar-kit 中进行负前瞻?

示例:我定义了两个标记 A 和 B,并且希望定义匹配 A 的规则,如果它后面没有 B。

我试图在这个语法中找到它,但我无法阅读它。

0 投票
1 回答
847 浏览

parsing - 在 .bnf 中固定和恢复时(解析)

我已经在互联网上进行了广泛搜索(现在至少半天),但似乎找不到所需的答案。

目前我正在尝试为.bnf-file具有自定义语言支持的 IntelliJ-Plugin 创建一个。

一些教程提到了{pin=1},{pin=2}和的存在{recoverWhile=xyz},但我没有找到任何关于它们用途的真正解释,以及是否还有其他我应该知道的事情(也许 a{pin=3}也存在?)。

那么有人可以告诉我这些标志、方法或它们的名称到底是什么,以及如何在我的 .bnf 中使用它们吗?

谢谢你的帮助和最好的问候, Fuchs

0 投票
1 回答
118 浏览

parsing - 不平衡的树。很可能是由不平衡的标记引起的

我正在开发一个 IntelliJ 插件,它将添加对自定义语言的支持。目前,我仍在尝试习惯语法工具包以及插件开发的工作原理。

为此,我开始研究基本表达式的解析器:

根据 JetBrains 提供的文档,我尝试为上述示例编写 BNF 和 JFlex 语法。

这些语法生成的代码可以编译,但是当插件运行时,它会崩溃:

java.lang.Throwable:不平衡树。很可能是由不平衡的标记引起的。尝试针对传递的 PsiBuilder 调用 setDebugMode(true) 以确定问题的确切位置

启用调试模式会打印一长串跟踪:

即使有这些调试日志,我仍然不明白出了什么问题。我试过用谷歌搜索,我什至无法弄清楚“标记”在这种情况下是什么意思......

这是 BNF 语法:

0 投票
1 回答
151 浏览

parsing - idea 语法工具包 recoverWhile 对列表中的第一个元素进行解析

我有一个 bnf 语法:

要测试的文本:

如果我在第二个或以后的元素中出错,一切都可以,但如果在第一个元素中,Sectio: Chapter One所有 psi 树都会被破坏。

在此处输入图像描述

0 投票
1 回答
184 浏览

intellij-idea - 如何解决在语法工具包中使用关键字作为标识符的歧义

我一直在尝试为 Grammarkit 编写 graphql 语言语法,但我发现自己在很长一段时间内都陷入了歧义问题。graphql 中的关键字(例如:、、、typeimplementsscalar可以是类型或字段的名称。IE

起初我tokens在 bnf 中定义了这些关键字,但这意味着上面的情况是无效的。但是如果我在描述规则时直接写这些关键字,就会导致语法上的歧义。我根据下面的语法看到的一个问题示例是,如果您定义了这样的内容

PSI 查看器告诉我,在@cool它的位置期待 a DirectiveAddtlLocation,这是我什至在标量规则中都没有引用的规则。有没有人熟悉语法包并遇到过这样的事情?我真的很感激一些见解。谢谢你。

这是我上面提到的错误示例的语法摘录。