我想使用flex/bison解析器创建一个read-eval-print循环.问题是,flex生成的lexer需要FILE*类型的输入,我希望它是char*.有什么办法吗?

一个建议是创建一个管道,向其提供字符串,打开文件描述符并发送到lexer.这相当简单,但感觉复杂,不太独立于平台.有更好的办法吗?

推荐答案

以下 routine 可用于设置输入缓冲区,以便扫描内存字符串而不是文件(正如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_状态句柄(处理完后必须使用YY_delete_BUFFER()删除),以便yylex()扫描字符串或字节的副本.这种行为可能是可取的,因为yylex()修改它正在扫描的缓冲区的内容).

如果要避免复制(和yy_delete_缓冲区),请使用:

  • YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size)

主样本:

int main() {
    yy_scan_buffer("a test string");
    yylex();
}

C++相关问答推荐

命名信号量不会像进程之间同步中假设的那样工作

生成C代码时自动复制/生成' tmwtypes.h '依赖项

在x86汇编中,为什么当分子来自RDRAND时DIV会引发异常?

strftime函数中%s的历史意义是什么?为什么没有记录?

sizeof结果是否依赖于字符串的声明?

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

C中的__attributor__((aligned(4),packed))与 struct 的用法

为什么在C中进行大量的位移位?

如何一次获取一个字符

Sizeof(&Q;字符串&Q;)的正确输出是什么?

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

我的C函数起作用了,但我不确定为什么

为什么未初始化的 struct 的数组从另一个数组获取值?

指向不同类型的指针是否与公共初始序列规则匹配?

当我用scanf(&Q;%S%S%S&Q;,单词0,单词1,单词2)输入多个单词时,除了最后一个单词外,每个单词的第一个字符都丢失了

无法识别C编程语言的语法,如书中所示

强制GCC始终加载常量(即只读),即使启用了优化

为什么这个代码的最后一次迭代不能正常工作?

C: NULL>;NULL总是false?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?