lex和yacc输出

时间:2014-11-18 07:45:59

标签: c output yacc lex

如何修改我的lex或yacc文件以在文件中输出相同的输入?我从一个文件中读取语句,我想为特殊语句添加一些不变量并将其添加到输入文件然后继续语句。例如,我读了这个文件:

    char mem(d);
int fun(a,b);
  char a ; 

输出应该是:

char mem(d);
int fun(a,b);
 invariant(a>b) ;
 char a;

我无法做到这一点。我只能将新语句写入输出文件。

2 个答案:

答案 0 :(得分:1)

了解为什么这是一个非平凡的问题是有用的。

目标是

  1. 将整个输入复制到输出;以及

  2. 在解析时插入一些额外的信息。

  3. 问题是第一个需要由扫描程序(词法分析器)完成,因为扫描程序通常不会将每个字符传递给解析器。它通常会删除空白,评论,至少。它可能会做其他事情,比如将数字转换为二进制表示,丢失原始文本表示。

    但显然,第二个显然需要由解析器完成。这就是问题所在:解析器(几乎)始终是扫描器后面的一个令牌,因为它需要先行令牌来决定是否减少。因此,在执行缩减操作时,扫描程序已经处理了所有输入数据,直到下一个标记的末尾。如果扫描程序正在回显输入到输出,则已输出解析器要插入数据的位置。

    两种方法都表明了自己。

    首先,扫描程序可以将所有输入传递给解析器,方法是将额外数据附加到每个令牌。 (例如,它可以将所有空格和注释附加到以下标记。)这通常用于语法着色和重新格式化应用程序,但是以正确的顺序获取令牌输出可能很难,因为还原操作在下订单后走。

    其次,扫描程序可以只记住输入文件中每个标记的位置,并且解析器可以将标记(例如附加输出)附加到标记位置。然后可以再次读取输入文件并与注释合并。不幸的是,这要求输入可以重绕,这将阻止从管道解析,例如;一个更通用的解决方案是将输入复制到一个临时文件中,或者如果你不希望它太大,就把它保存在内存中。

答案 1 :(得分:0)

由于你已经可以输出你自己的语句,你的问题是如何在读入时写出输入。在lex中,每个读取的标记的值是available in the variable yytext,所以只需写出来对于您阅读的每个令牌。根据词法分析器的编写方式,这也可用于回显空格。