我正在为cool开发一个编译器,作为编译器课程的分配,但是我想在notepad ++中使用很酷的语言编写代码,因此我需要为notepad ++定义这种语言,我已经以flex格式编写了lexer定义,我我要开发一个很酷的解析器。无论如何,可以使用这些材料来定义记事本++的语言吗?
据我所知,Noteoad ++基于Scintilla,Scintilla提供了一种使用Scintilla源文件doc/Lexer.txt中描述的协议来添加自定义词法分析器的机制。
基本上,要使用该协议制作由flex生成的词法分析器处理文本,您要么需要将要扫描的文本读取到临时缓冲区中,要么需要显示yylex
如何读取文本(这意味着使用自定义YY_INPUT
macro)。
我会选择第一个选项,因为要自定义YY_INPUT
,您需要确保在函数中可以看到几个值,其中包括YY_INPUT
的扩展名,但是不幸的是,flex的作者从未真正考虑到了这种需求。 (不过可以这样做。我只是避免了冗长的描述,以了解如何做。)
为了向YY_INPUT
提供正确的参数,您需要跟踪当前的闪烁光标位置。为此,请将光标变量初始化为styler.ColourTo()
,并在
every操作中使用startPos
将其递增。 Flex使在每个操作中轻松执行某件事变得很简单:只需定义宏cursor += yyleng
。 (注意:如果使用YY_USER_ACTION
或YY_USER_ACTION
,则需要在相应的操作中校正光标位置。)