c - 字符串输入到 flex 词法分析器

标签 c bison yacc lex flex-lexer

我想使用 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/

相关文章:

bison - 解决Shift/Reduce冲突的语法规范

c++ - 如何将 API 从 lex yacc 设置为 Program

string - 在Flex/Bison中实现字符串插值

C 中的 Cell SPU 错误

c - 基本 C 循环比较

c - 用 C 语言模拟逻辑门的最佳方法?

c - yylineno 给出错误报告的意外结果

function - Flex&Bison : define main function in a separate file

yacc - 如何将 lex 文件中的 yytext 传递给 yacc?

c - RSA_private_decrypt 返回 -1