使用File Pointer for Bison附加字符串

时间:2014-06-24 14:21:25

标签: c++ c file-io bison

我在C中使用Flex和Bison编写了一个简单的解释器。我正在使用Line' yyin = fopen(argv [0]," r")读取要解释的文件;& #39 ;.好。现在我使用CGI从浏览器获得一些请求。这是我从Broswer收到的样本数据。

  

ABC ="你好"

     

CFG ="欢迎"

     

计数= 10

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

2 个答案:

答案 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

时将释放该缓冲区