flex和bison可以接受来自其他来源的输入吗?

时间:2012-01-09 19:48:00

标签: c++ bison

我将在Qt中编写一个文本编辑器,它可以为编程语言(玩具语言,用于学习目的)提供突出显示/代码完成/语法分析。

起初,我想过编写手工C ++,这对我来说更舒服,因为我比较熟悉。然而,经过搜索,我发现flex / bison可以简化解析器的创建。在尝试一些简单的例子后,似乎工作示例接受来自终端中标准输入的输入。所以,我只想知道,flex / bison可以接受来自GUI框架中文本编辑器小部件的输入(例如Qt,我将在解析器引擎中完成一些功能之后同时学习它),然后将结果输出回文本编辑器?

2 个答案:

答案 0 :(得分:6)

如果您不想使用FILE *指针,您还可以通过创建FLEX输入缓冲区从内存缓冲区(如字符数组和nul终止的C类型字符串)进行扫描 - yy_scan_string()从null创建缓冲区终止字符串,yy_scan_bytes从固定长度字符数组创建缓冲区。有关详细信息,请参阅flex文档中的Multiple Input Buffers

如果这不符合您的需求,您还可以重新定义YY_INPUT宏以进行完全控制 - 请参阅Generated Scanner

答案 1 :(得分:5)

flex从yyin读取其输入。如果您将其指向不是stdin的内容...例如,请参阅here

修改:顺便说一下,yyinFILE *。你正在使用C ++,这意味着你想要传递一个流。请阅读flex documentation on C++ interfacing

Edit2:对于输出......你是规则的一个编程yacc / bison动作,还有错误处理程序。从这个意义上说,你在那里做了很多自由。例如,您可以“发出”突出显示的代码,并在分析代码时使用错误处理程序指出错误。完成将迫使你实现至少部分语义(符号表等),但这是一个不同的故事......