c - lex 和 yacc 输出

标签 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;

我做不到。我只能将新语句写入输出文件。

最佳答案

理解为什么这是一个不平凡的问题很有用。

目标是

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

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

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

但是第二个显然需要解析器来完成,很明显。这就是问题所在:解析器(几乎)总是落后于扫描器一个标记,因为它需要先行标记来决定是否减少。因此,在执行缩减操作时,扫描器已经处理了所有输入数据,直到下一个标记结束。如果扫描器正在将输入回显到输出,那么解析器要插入数据的地方已经输出了。

有两种方法。

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

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

关于c - lex 和 yacc 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26989081/

相关文章:

Objective-C 和 Bison 警告 : stray `@'

c - 让 scanf 在读取换行符时退出?

java - 垃圾收集器意外输出

c++ - boolean 值 c++ 的格式化输出

C++ 错误 'else' 没有前一个 'if'

c - Bison/Yacc 中的 For 循环语义

c - 是否真的有必要关闭进程中未使用的管道端

C fprintf 十六进制错误输出

c - 使用callstack在C中实现栈数据结构?

regex - 不区分大小写的关键字匹配