我在C中使用Flex和Bison编写了一个简单的解释器。我正在使用Line' yyin = fopen(argv [0]," r")读取要解释的文件;& #39 ;.好。现在我使用CGI从浏览器获得一些请求。这是我从Broswer收到的样本数据。
ABC ="你好"
CFG ="欢迎"
计数= 10
现在我需要将这些行添加到我要解释的文件中。我该怎么做这个任务? 我试图将yyin与c ++文件Streams连接起来。这样我就可以将从浏览器接收的数据转换为StringStream。并附加文件流。但yyin指针只接受I / O指针。有没有其他方法可以将这些数据与我的语言代码合并?
答案 0 :(得分:1)
在CGI环境中,浏览器的输入应该可以通过stdin
获得。所以你可以设置yyin = stdin;
。如果你想首先解析一个文件的内容(这对我来说很奇怪,但我确定你有理由),那么你需要使用flex manual中描述的yywrap
:
当扫描程序收到
YY_INPUT
的文件结束指示时,它会检查yywrap()
功能。如果yywrap()
返回false(零),则假定该函数已经完成并设置yyin
以指向另一个输入文件,并继续扫描。如果它返回true(非零),则扫描程序终止,向其调用者返回0。请注意,在任何一种情况下,开始条件保持不变;它不会还原为INITIAL
。
当然,你需要记住只做一次。这样的事情可能有用:
int yywrap() {
if (yyin == stdin) return 1;
yyin = stdin;
return 0;
}
但是,在CGI环境中读取POST请求并不是那么简单。通常,您需要通过了解指定的内容长度和/或分块编码来确保您不会超出正文的末尾。如flex手册的引用章节所示,您可以重新定义YYINPUT
宏以提供自定义输入阅读器。
答案 1 :(得分:1)
由于您正在使用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