【问题标题】:lex and yacc outputlex 和 yacc 输出
【发布时间】:2017-11-21 00:49:03
【问题描述】:

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

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

输出应该是这样的:

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

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

【问题讨论】:

    标签: c output yacc lex


    【解决方案1】:

    了解为什么这是一个重要的问题很有用。

    目标是

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

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

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

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

    有两种方法建议自己使用。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        相关资源
        最近更新 更多