我想使用 flex/bison 解析器创建一个 read-eval-print 循环。问题是,flex 生成的词法分析器需要 FILE* 类型的输入,而我希望它是 char*。有办法做到这一点吗?
一个建议是创建一个管道,将字符串提供给它并打开文件描述符并发送到词法分析器。这相当简单,但感觉很复杂,而且不是很独立于平台。有没有更好的办法?
最佳答案
以下例程可用于设置输入缓冲区以扫描内存中的字符串而不是文件(如 yy_create_buffer 所做的那样):
YY_BUFFER_STATE yy_scan_string(const char *str)
:扫描以 NUL 结尾的字符串`YY_BUFFER_STATE yy_scan_bytes(const char *bytes, int len)
:从位置字节开始扫描 len 个字节(可能包括 NUL)
请注意,这两个函数都会创建并返回相应的 YY_BUFFER_STATE 句柄(完成后必须使用 yy_delete_buffer() 删除),因此 yylex() 会扫描字符串或字节的副本。这种行为可能是可取的,因为 yylex() 修改了它正在扫描的缓冲区的内容)。
如果你想避免复制(和 yy_delete_buffer)使用:
YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size)
主要示例:
int main() {
yy_scan_buffer("a test string");
yylex();
}
关于c - 字符串输入到 flex 词法分析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780676/