【问题标题】:How to write complex syntax parser in flex/bison and connect it as vim plugin?如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?
【发布时间】:2017-11-23 21:39:42
【问题描述】:

如何在flex/bison中编写复杂的语法解析器并将其连接为vim插件?

需要一些通用的方法来使用 flex/bison 制作 vim 着色器(以及在理想情况下完成)插件 - 特别是对于一些复杂的语言,愚蠢的 vim 正则表达式无法涵盖。

类似 Eclipse 的“大纲”选项卡应使用相同的方法——解析源代码并制作可点击的侧面板以快速导航源代码。

PS:win32 (mingw) .dll 最好用于此构建:http://www.vim.org/download.php#pc

【问题讨论】:

  • 开始您的项目,并在您有实际可以回答的与编程相关的实际问题时回来。
  • 问题实际上得到了回答

标签: vim bison flex-lexer vim-plugin


【解决方案1】:

那么,您希望通过基于 flex/bison 的解析器在 Vim 之外对 Vim 缓冲区进行实际解析,然后根据该解析在 Vim 中执行突出显示,对吗?

嗯,在 Vim 中,突出显示是基于正则表达式(给定 :syntax match:syntax region 命令)。没有办法解决这个问题(除了扩展 Vim 本身)。

我看到的唯一方法是对解析的元素使用行/列寻址。 Vim 正则表达式具有仅匹配特定位置的特殊原子(:help /\%l:help /\%v)。

在 Vim 8 中,您可以通过新的 :help channel 功能触发解析器(在后台异步)。

示例

您的解析器在第 3 行,屏幕第 14-16 列识别了一个标识符。你会合成以下 Vim 命令:

:syntax match Identifier "\%3l\%>13v\%<17v."

批评

这适用于静态缓冲区内容。一旦您进行编辑,突出显示可能会落后。 Vim 在您键入时应用基于正则表达式的突出显示,但您的外部解析会增加一些延迟。

对于复杂的语法/大缓冲区,不同语法元素的数量可能会导致 Vim 中的性能下降。我不确定基于正则表达式的寻址效率如何;这需要进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多