我想使用flex/bison解析器创建一个read-eval-print循环.问题是,flex生成的lexer需要FILE*类型的输入,我希望它是char*.有什么办法吗?
一个建议是创建一个管道,向其提供字符串,打开文件描述符并发送到lexer.这相当简单,但感觉复杂,不太独立于平台.有更好的办法吗?
我想使用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();
}