微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在 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 举报,一经查实,本站将立刻删除。