来自PEG(解析表达式语法)的智能感知
Intellisense from PEG (Parsing expression grammar)
如果这个问题已经被问到,我提前道歉。我有一种由语法定义的语言,我想知道人们如何为他们的自定义语法实现智能感知。这在我看来是机械的;用户输入一些内容,然后将其提供给生成的解析器,并提供关键字建议。我猜解析将需要修改,以便它是增量的,而不是一次性的,即生成的解析器。
我是这个领域的新手,所以欢迎任何建议。
我打算使用http://pegjs.majda.cz/,但什么都可以
我为一些需要语法高亮显示各种自定义语言的项目编写了一个codemmirror语法附加组件。
可以为任何语言定义JSON格式的语法(或变体,因为JSON语法可以扩展其他JSON语法),附加组件自动创建一个代码镜像解析器,可以包括语法部分和语法错误,自动完成和更多
查看这里的实际示例
注意:插件中使用的json语法格式在许多方面类似于PEG语法形式(可能有更多选项)。但主要用于生成语法高亮解析器。这个项目还在发展中,将来可能会添加更多的选项。
我认为这将取决于您的解析器返回的内容。例如,D编程语言中的挂钩库。它的用法如下:
language.d:
module language;
import pegged.grammar;
enum Language = `
Math:
Content < Sentence+
Sentence < LetStmt "."
LetStmt < Let Var Be A Vocab
Vocab < FormWord / Word
FormWord <- HyphenForm "-" Word / Word "-" HyphenForm
HyphenForm < ("(" Form ")" / Var / ZZ)
Word <- LatinWord
LatinWord <~ LatinAlpha+
Var <- identifier
LatinAlpha <- [a-zA-Z]
ZZ <~ [0-9]+
Form <~ .+
Let <- "Let" / "let"
Be <- "be"
A <- "An" / "an" / "A" / "a"
`;
mixin(grammar(Language));
app.d:
import std.stdio;
import language;
void main()
{
while (true) {
auto text = readln();
auto parseTree = Math(text);
writeln(parseTree);
}
}
控制台I/O:
Let G be a group
Math (failure)
+-Math.Content (failure)
+-Math.Sentence (failure)
+-Math.LetStmt[0, 17]["Let", "G", "be", "a", "group"]
| +-Math.Let[0, 4]["Let"]
| +-Math.Var[4, 6]["G"]
| +-Math.Be[6, 9]["be"]
| +-Math.A[9, 11]["a"]
| +-Math.Vocab[11, 17]["group"]
| +-Math.Word[11, 17]["group"]
| +-Math.LatinWord[11, 16]["group"]
+-literal!(".") Failure at line 1, col 0, after "e a group'n" expected "'".'"", but got ""
Let G be a group.
Math[0, 18]["Let", "G", "be", "a", "group", "."]
+-Math.Content[0, 18]["Let", "G", "be", "a", "group", "."]
+-Math.Sentence[0, 18]["Let", "G", "be", "a", "group", "."]
+-Math.LetStmt[0, 16]["Let", "G", "be", "a", "group"]
+-Math.Let[0, 4]["Let"]
+-Math.Var[4, 6]["G"]
+-Math.Be[6, 9]["be"]
+-Math.A[9, 11]["a"]
+-Math.Vocab[11, 16]["group"]
+-Math.Word[11, 16]["group"]
+-Math.LatinWord[11, 16]["group"]
可以看到,当我第一次输入"Let G be a group"时,我忘记了句末的句号。这将导致解析失败。至少打印parseTree会显示这一点,也许遍历parseTree也会让您看到失败。
当出现失败时,它显示了"所期望的"。这不正是您在智能感知下拉菜单中所期望显示的部分吗?
我自己也不确定。这篇文章只是对这个问题的一个思考
相关文章:
- JetBrains网络风暴智能感知
- 使用MVC捆绑时CSHTML文件中的Javascript智能感知
- 为带有 XML 注释的类实例启用 Javascript 智能感知
- 无论如何,在Visual Studio智能感知中定义一个未定义的对象
- 创建与智能感知一起工作的JavaScript函数
- 打字稿 0.9.1 : 非常慢的智能感知 我应该回到 0.8.3 以获得更好的性能吗?
- Javascript中的Visual Studio和XML注释使“公共”方法在智能感知中消失
- 如何避免未声明的变量破坏智能感知
- 你能隐式地告诉智能感知变量是什么类型吗?
- 在Visual Studio 2013-2015中要求JS智能感知
- 有人能解释Visual Studio的这种行为吗;的Javascript智能感知
- Visual Studio 2010中缺少javascript智能感知
- 什么免费的javascript编辑器可以做这种智能感知
- Visual Studio'的Javascript智能感知可以在'this'关键字
- 是否有任何解决方案来引用javascript文件不在当前的解决方案,在VS2010智能感知
- JavaScript智能感知类型转换
- jquery -传递参数的智能感知
- 没有获得mongodb的智能感知
- NodeJS - Typescript -智能感知
- VS Code智能感知javascript不工作,如果我正在编辑typescript