flex中的字符串转义处理

时间:2014-04-22 18:53:11

标签: string flex-lexer lexer

对于关于编译器的课程,我正在构建词法分析器。我已完成作业,但留下了一点,我并不完全满意。

该语言支持带有转义序列的字符串文字,其中字符串文字定义为由双引号(")括起来的字符序列,转义序列以反斜杠(\)开头。词法分析器应该为字符串文字生成一个令牌,其中已经处理了转义序列(例如用换行符替换\n,用选项卡替换\t。)

我的问题是,是否可以识别此类字符串文字(并处理其中包含的转义序列)而无需将目前匹配的部分复制到临时缓冲区?如果有可能,该怎么做。

1 个答案:

答案 0 :(得分:1)

当然可以在不使用临时缓冲区的情况下识别文字,但是不可能处理它们,原因很简单:flex拥有输入缓冲区和{{1}指向的字符串(它恰好是指向输入缓冲区的指针,但也不能保证)。

但这并不重要。正如您将很快发现的那样,在将词法分析器与yytext / yacc结合使用时,您需要将任何词法字符串复制到临时缓冲区中,因为bison / {{ 1}}需要在输入中提前读取一个标记,并且 - 如上所述 - yacc / bison不保证一旦它开始就保留lex指向的字符串识别下一个标记。 (这不是理论上的:它确实不保留字符串的值,“为什么我的字符串不断变化?”可能是最常见的yacc / lex问题(根据bison手册,最常见的无效错误报告)

有一些解决方法 - 包括编写自己的词法分析器 - 但是它们需要大量的簿记而且价值很低,因为复制令牌字符串实际上并不是一项非常昂贵的操作。所以我的建议是:复制你的字符串,不要担心。 :)