问题标签 [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 回答
177 浏览

intellij-plugin - 我可以只使用 GrammarKit 为 Intellij 插件开发生成解析器和词法分析器吗(自定义语言)

在Intellij Plugin 开发的自定义语言支持教程中,它使用 GrammarKit 生成 ParserJFlex(已修补)生成 Lexer

此页面上,作者说我们可以“使用 GrammarKit 插件生成词法分析器和解析器”。

JetBrains 建议使用 JFlex 生成词法分析器是否有特殊原因?如果我们使用 GrammarKit 来生成两者,这个过程会有多大不同?

0 投票
1 回答
498 浏览

intellij-idea - 如何为 IntelliJ 制作简单的计算器语法高亮显示?

我正在根据教程制作自定义语言支持插件,但我遇到了一些 .bnf 概念。假设我想解析一个支持 +、-、*、/、一元 - 和括号的简单计算器语言。这是我目前拥有的:

柔性:

恩夫:

首先它抱怨 expr 是递归的。如何将其重写为不递归?其次,当我尝试编译并运行它时,它在尝试解析此语法时冻结了idea测试实例,看起来像一个无限循环。

0 投票
2 回答
246 浏览

intellij-idea - 如何处理 IntelliJ 语法工具包中的文件结尾

我正在使用 Grammar-Kit 为 DSL 提供 IntelliJ 支持。我在 bnf 文件中有一条规则,最后需要一个 EOF(文件结尾)令牌: rule ::= ( object | (( LCURL EOL* properties EOL* RCURL ) | properties ) ) EOL* EOF

我以为我可以在 flex 文件中简单地创建一个词法分析器规则<<EOF>> { return EOF;},就是这样。不幸的是,在 IntelliJ 代码的更深处,处理词法分析器advance()方法的逻辑不会完成,除非它从词法分析器中获得一个空值,导致无限循环作为结束文件返回一个非空标记。

是否有任何优雅(简单)的方法来处理语法工具包中的文件结尾,允许在解析器定义(bnf)中使用“文件结尾”?

0 投票
1 回答
114 浏览

python - 是否可以使用语法工具包导入另一种语言?

我正在为 PyCharm 中的 Kivy 开发一个自定义语言支持插件,我想我需要将一些 python 表达式导入其中,因为 .kv 文件允许在属性定义和 on_properties 回调定义中使用一些 python 代码。

这是必要的吗?怎么可能?我该怎么做呢?

0 投票
1 回答
67 浏览

intellij-plugin - GrammarKit 插件中的方法注入不起作用

我试图通过在 PsiImplUtil 类中创建方法来覆盖我的一些 PsiElements 中的 getReference() 方法,但没有注入任何方法。下面是需要方法 (ValidNameExpr) 的元素。我确定我只是在某个地方犯了一个小错误,但我不明白为什么这不起作用。我尝试使该方法成为非静态方法,但这也无济于事。如果您知道可能出了什么问题,您能帮忙吗?

这是带有方法实现的 util 类

这是我的 .BNF 文件

0 投票
0 回答
44 浏览

dsl - 如何在语法工具包中的 Lexer 识别元素之上包装复合 PsiElement

我是intellij插件写作的新手。我开始为我们的一种自定义语言编写一个 intellij 插件。我正在按照intellij 官方网站中给出的教程进行操作。我还从 github下载了他们的Grammar-Kit 存储库以了解代码库。

在编写我的插件时,我将 jflex 用于 Lexer,将 bnf 语法用于解析器。我发现很难实现一个词法分析器来向解析器发送正确的标记。

我在 Grammar-Kit 存储库中看到Lexer(用于 bnf)非常简单,它只识别字符串、数字、Id、空格、注释和特殊字符('('、'*' 等)。它确实无法识别 bnf 关键字,例如“private”、“external”、“meta”等。

现在,当我看到示例 bnf 文件的 PSI 树时,请说该行,

如下,

我在这里看到的是“私有”被 Lexer 识别PsiElement.id,之后一些代码用 BnfModifier 对象包装它,该对象被声明为 bnf文件。BNF_SEQUENCE、BNF_REFERENCE_OR_TOKEN、BNF_STRING_LITERAL_EXPRESSION 等也是如此。它们都不能被 Lexer 识别,但是一些代码用 bnf 文件声明的对象包装它们。

我想了解这种包装是如何在 Lexer 识别的标记之上完成的。它将帮助我识别 DSL 中的关键字并以不同的方式突出显示它们,自动完成它们等。

谢谢,

苏霍吉特

0 投票
1 回答
274 浏览

regex - 在 PSI 预览模式下无法识别 intellij 语法工具包 BNF 语法中的字符串和字符标记

我正在尝试为 intellij 开发语言插件,并按照教程使用 Grammar-Kit 和 PSI 插件。我开发了一个简单的基于 BNF 的语法,但它在 PSI 预览中不起作用。语法如下:

测试程序是:

错误是'字符串预期,得到“dd”:2'

任何帮助将非常感激。

0 投票
0 回答
60 浏览

grammar-kit - 语法工具包教程?.bnf 和 .flex 文件指令?

我正在使用 Grammar-Kit 为其他语言做一个插件。-> https://github.com/JetBrains/Grammar-Kit 我不确定 .bnf 和 .flex 文件负责什么?在我看来,.bnf 定义了这种语言的操作方式:例如。赋值为 (a = 1) 甲酸盐。.flex 文件呢?

0 投票
0 回答
17 浏览

intellij-plugin - 如何使用 GrammarKit BNF 在多个表达式中使用相同的标记?

我正在尝试为 IntelliJ IDE 实现自定义语言插件(林登脚本语言)。

该语言具有 XYZ 向量类型,您可以使用以下构造创建向量:

但这种结构也是有效的:

但我不知道如何使用 GrammarKit 指定这样的语法。这是一个简短的 BNF 文件,例如:

一切都像这样正常工作:

但在这种情况下显示错误,不带括号:

有人可以帮助我并告诉我如何解决这个语法吗?