在 CodeMirror 中使用 Lezer 从语法中自动补全

问题描述

我想使用 Lezer 在 CodeMirror 中实现自动完成,其中自动完成是根据我的语言语法生成的。是否有任何示例实现,或者您可以指出 Lezer API 的特定部分作为实现此的起点?

到目前为止,我的简单示例语法大致如下(这是 Python Lark EBNF 格式。这是不完整的;这只是一个示例)--

?start: function_call_retval_number
      | function_call_retval_string

number_arg: function_call_retval_number
          | NUMBER

number_args: number_arg ("," number_arg)+

two_number_args: number_arg "," number_arg

?function_call_retval_number: ADD number_args ")"
                            | ADD2 two_number_args ")"
                            | MULTIPLY number_args ")"

ADD: /add(\s)*\(/

ADD2: /add2(\s)*\(/

MULTIPLY: /multiply(\s)*\(/

我复习了[示例:编写语言包][https://codemirror.net/6/examples/lang-package/]和[编写语法][https://lezer.codemirror.net/docs/指南/#writing-a-grammar];看来我可以很容易地将上面的转换为 Lezer 的语法格式。

看来我可能想朝这个方向走--

  1. 使用 lezer-generator 从我的语法中生成解析器

  2. 实现一个 [CompletionSource][https://codemirror.net/6/docs/ref/#autocomplete.CompletionSource] 调用 [Parser.parse()][https://lezer.codemirror.net /docs/ref/#lezer.Parser] 与输入文本。

  3. ??例如,如果输入文本是“add(1,add(”,我看不到 API 方法或异常,我可以用来推断此时有效的是“NUMBER”、“add”、“add2”,或“乘”,以便 CompletionSource 可以构建适当的返回值。

任何反馈、建议和/或示例?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)