我在C语言中使用Flex和Bison编写了一个简单的解释器。我正在读取要使用“yyin=fopen(argv[0],“r”);”行解释的文件。好。现在我得到一些来自浏览器的请求使用CGI。这是我从Broswer那里得到的样本数据。
abc=“你好”
cfg=“欢迎”
计数=10
现在我需要将这些行添加到要解释的文件中。我该怎么做?
我试着用c++文件流连接yyin。以便我可以将从浏览器接收到的数据转换为StringStream。并附加文件流。但是yyin指针只接受I/O指针。有没有其他方法可以将这些数据与我的语言代码合并?
最佳答案
在CGI环境中,浏览器的输入应该可以通过stdin
获得。所以你可以设置yyin = stdin;
。如果您想首先分析文件的内容(这在我看来很奇怪,但我相信您有您的原因),那么您需要使用yywrap
如flex manual中所述:
当扫描仪从YY_INPUT
接收到文件结束指示时,它会检查yywrap()
功能。如果yywrap()
返回false(零),则假定函数已执行并设置yyin
以指向另一个输入文件,然后继续扫描。如果返回true(非零),则扫描程序终止,并将0返回给调用方。注意,在这两种情况下,启动条件都保持不变;它不会恢复到INITIAL
。
当然,你需要记住只做一次。类似的事情可能会奏效:
int yywrap() {
if (yyin == stdin) return 1;
yyin = stdin;
return 0;
}
然而,在CGI环境中读取POST请求并不是那么简单。通常,您需要知道指定的内容长度和/或分块编码,以确保您的阅读不会超出正文的末尾。如flex手册中引用的章节所示,您可以重新定义
YYINPUT
宏,以便提供定制的输入阅读器。关于c++ - 使用File Pointer for Bison附加字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24389097/