我在C中使用Flex和Bison编写了一个简单的解释器。我正在读取要使用行‘y阴= fopen( argv,"r“);’解释的文件。井。现在,我使用CGI从浏览器获得一些请求。这是我从妓院收到的样本数据。
Abc=“你好” Cfg=“欢迎” count=10
现在,我需要将这些行添加到我的文件中,以便对其进行解释。我怎样才能完成这个任务?我试图将yyin与c++文件流连接起来。这样我就可以将从浏览器接收到的数据转换为StringStream。并附加到文件流中。但是yyin指针只接受I/O指针。还有其他方法将这些数据与我的语言代码合并吗?
发布于 2017-11-17 23:33:39
由于使用的是flex,所以可以使用yy_scan_string来解析缓冲区而不是文件:
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时将释放该缓冲区。
发布于 2014-06-24 17:28:21
在CGI环境中,来自浏览器的输入应该可以通过stdin获得。这样你就可以设置yyin = stdin;了。如果您想首先解析一个文件的内容(这在我看来很奇怪,但我相信您有自己的理由),那么您需要使用yywrap,如挠曲手册中所描述的:
当扫描仪从
YY_INPUT接收到文件结束指示时,它将检查yywrap()函数.如果yywrap()返回false (0),则假定该函数已经执行,并设置yyin指向另一个输入文件,然后继续扫描。如果它返回true (非零),则扫描器终止,将0返回给调用方.请注意,在这两种情况下,开始条件保持不变;它不会恢复为INITIAL。
当然,你需要记住只做一次。像这样的东西可能会起作用:
int yywrap() {
if (yyin == stdin) return 1;
yyin = stdin;
return 0;
}但是,在CGI环境中读取POST请求并不那么简单。通常,您需要通过知道指定的内容长度和/或分块编码,确保在正文结束后不会读取。如flex手册中所引用的章节所示,您可以重新定义YYINPUT宏,以便提供自定义的输入读取器。
https://stackoverflow.com/questions/24389097
复制相似问题