如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?
How to write complex syntax parser in flex/bison and connect it as vim plugin?
如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?
需要一些通用的方法来使用 flex/bison 来制作 vim 着色器(在理想情况下完成)插件 -- 特别是对于一些复杂的语言,不能被 dumb vim 正则表达式。
类似 Eclipse 的 "outline" 选项卡应使用相同的方法 -- 解析源代码并制作可点击的侧面板以实现快速源代码导航。
PS: win32 (mingw) .dll 最好用于此版本:http://www.vim.org/download.php#pc
因此,您想通过 flex/bison-based 解析器对 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 内的性能下降。我不确定基于正则表达式的寻址效率如何;这需要进行测试。
如何在 flex/bison 中编写复杂的语法解析器并将其连接为 vim 插件?
需要一些通用的方法来使用 flex/bison 来制作 vim 着色器(在理想情况下完成)插件 -- 特别是对于一些复杂的语言,不能被 dumb vim 正则表达式。
类似 Eclipse 的 "outline" 选项卡应使用相同的方法 -- 解析源代码并制作可点击的侧面板以实现快速源代码导航。
PS: win32 (mingw) .dll 最好用于此版本:http://www.vim.org/download.php#pc
因此,您想通过 flex/bison-based 解析器对 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 内的性能下降。我不确定基于正则表达式的寻址效率如何;这需要进行测试。