来自PEG(解析表达式语法)的智能感知

Intellisense from PEG (Parsing expression grammar)

本文关键字:智能 感知 语法 表达式 PEG 来自      更新时间:2023-09-26

如果这个问题已经被问到,我提前道歉。我有一种由语法定义的语言,我想知道人们如何为他们的自定义语法实现智能感知。这在我看来是机械的;用户输入一些内容,然后将其提供给生成的解析器,并提供关键字建议。我猜解析将需要修改,以便它是增量的,而不是一次性的,即生成的解析器。

我是这个领域的新手,所以欢迎任何建议。

我打算使用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也会让您看到失败。

当出现失败时,它显示了"所期望的"。这不正是您在智能感知下拉菜单中所期望显示的部分吗?

我自己也不确定。这篇文章只是对这个问题的一个思考