如何使用 flex-bison 中定义的正则表达式和语法为记事本++定义语言

How to define a language for notepad++ using regexp and grammar defined in flex-bison

我正在为 cool 编写编译器作为编译器课程作业,但我想在 notepad++ 中使用很酷的语言进行编码,所以我需要为 notepad++ 定义这种语言,我已经在中编写了词法分析器定义flex 格式,我将开发一个很酷的解析器。有没有办法用这些资料来定义notepad++的语言?

我也这么认为。 (我不使用 Notepad++ 因为我不用 Windows,所以我没有很好的方法来验证那个理论。)

据我所知,Noteoad++ 基于 Scintilla,Scintilla 提供了一种添加自定义词法分析器的机制,使用 Scintilla 源文件 doc/Lexer.txt 中描述的协议。

基本上,要使用该协议制作 flex 生成的词法分析器处理文本,您需要将要扫描的文本读取到临时缓冲区中,或者显示 yylex 如何读取文本(意味着用自定义 YY_INPUT macro).

编译你的词法分析器

我会选择第一个选项,因为为了自定义 YY_INPUT,您需要确保函数中的多个值可见,其中包括 YY_INPUT 的扩展,不幸的是,flex 的作者从未真正考虑过这种需求。 (不过,这是可以做到的。我只是避免对如何做到这一点进行冗长的描述。)

为了向 styler.ColourTo() 提供正确的参数,您需要跟踪当前闪烁光标的位置。为此,将游标变量初始化为 startPos 并在 every 操作中用 cursor += yyleng 递增它。 Flex 使在每个动作中做某事变得容易:只需定义宏 YY_USER_ACTION。 (注意:如果您使用yylessyymore,您需要在相应的操作中更正光标位置。)