首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Bison添加带有文件指针的字符串

为Bison添加带有文件指针的字符串
EN

Stack Overflow用户
提问于 2014-06-24 14:21:25
回答 2查看 174关注 0票数 0

我在C中使用Flex和Bison编写了一个简单的解释器。我正在读取要使用行‘y阴= fopen( argv,"r“);’解释的文件。井。现在,我使用CGI从浏览器获得一些请求。这是我从妓院收到的样本数据。

Abc=“你好” Cfg=“欢迎” count=10

现在,我需要将这些行添加到我的文件中,以便对其进行解释。我怎样才能完成这个任务?我试图将yyin与c++文件流连接起来。这样我就可以将从浏览器接收到的数据转换为StringStream。并附加到文件流中。但是yyin指针只接受I/O指针。还有其他方法将这些数据与我的语言代码合并吗?

EN

回答 2

Stack Overflow用户

发布于 2017-11-17 23:33:39

由于使用的是flex,所以可以使用yy_scan_string来解析缓冲区而不是文件:

代码语言:javascript
复制
YY_BUFFER_STATE buffer = yy_scan_string(my_string_buffer);
yyparse();
yy_delete_buffer(buffer);

这里,my_string_buffer只是一个指向内存的指针,其中包含要解析为以NUL结尾的字符串的文本。yy_scan_string生成字符串的副本(因此您可以立即将缓冲区用于其他东西),在调用yy_delete_buffer时将释放该缓冲区。

票数 2
EN

Stack Overflow用户

发布于 2014-06-24 17:28:21

在CGI环境中,来自浏览器的输入应该可以通过stdin获得。这样你就可以设置yyin = stdin;了。如果您想首先解析一个文件的内容(这在我看来很奇怪,但我相信您有自己的理由),那么您需要使用yywrap,如挠曲手册中所描述的:

当扫描仪从YY_INPUT接收到文件结束指示时,它将检查yywrap()函数.如果yywrap()返回false (0),则假定该函数已经执行,并设置yyin指向另一个输入文件,然后继续扫描。如果它返回true (非零),则扫描器终止,将0返回给调用方.请注意,在这两种情况下,开始条件保持不变;它不会恢复为INITIAL

当然,你需要记住只做一次。像这样的东西可能会起作用:

代码语言:javascript
复制
int yywrap() {
  if (yyin == stdin) return 1;
  yyin = stdin;
  return 0;
}

但是,在CGI环境中读取POST请求并不那么简单。通常,您需要通过知道指定的内容长度和/或分块编码,确保在正文结束后不会读取。如flex手册中所引用的章节所示,您可以重新定义YYINPUT宏,以便提供自定义的输入读取器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24389097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档