包含flex的附加规则

时间:2015-03-07 21:38:53

标签: include lex

我一直在使用一个使用flex的小型汇编程序,但是,flex规则列表相当长。理想情况下,我想通过将规则分成几个文件来解决这个问题,这些文件可以包含在主要的lex文件中。我的搜索没有发现相关性,这让我相信这个功能可能不存在。如果它不存在,我会很好奇,如果有人有一些替代建议。我目前唯一的替代方法是编写一个快速工具来预处理lex文件并构建一个新文件。这不是最漂亮的解决方案,但我认为它确实有效。

所以这个问题归结为两个问题:

  1. 有没有办法在flex中包含其他规则?
  2. 如果没有,你会提出什么替代方案(如果它们与我已提出的那个不同)?
  3. 如果有令人信服的理由,我不会严格反对转移到另一个词法分析器。但是,在这种情况下,词法分析器需要能够生成C或C ++,或者可以轻松地合并到这个项目中。我确实认为这个选项是最后的选择。

2 个答案:

答案 0 :(得分:1)

flex当然不包含与C预处理器#include指令类似的任何功能。

此外,使用C预处理器预处理扫描程序定义会有点尴尬,因为扫描程序描述通常包括要转录到输出文件中的预处理程序命令,而C预处理程序没有任何机制来有条件地保留指令。

然而,没有什么可以阻止你简单地连接几个文件来产生扫描仪定义:

flex -o scanner.c scanner.options scanner.definitions keyword_rules.l other_rules.l

答案 1 :(得分:0)

所以我现在一直在玩各种解决方案,最后有一个我特别满意的。我最终使用bash来快速实现“flex_include”脚本。

在我解释语法之前,这里是我提出的脚本:

#!/bin/bash
while read -r line
do
if [[ $line =~ "<<INCLUDE>>".* ]]; then
    file=$(echo $line | cut -d'"' -f2)
    while read -r line2
    do
        echo "$line2"
    done < $file
else
    echo "$line"
fi
done < $1

这允许在lex文件中包含语法为<<INCLUDE>> "my_file.l"的文件。我选择了类似于<<EOF>>的命名约定,因此它很适合flex语法。脚本的使用相当简单,但有一个警告 - 管道不能直接工作。我不知道为什么会在lex.yy.c顶部生成两条额外的行。我发现流程替换工作正常:flex <(./flex_include.sh mips.l)。这个脚本在语法上是非常宽容的,所以请记住脚本将接受比它应该更多的东西。它将使用<<INCLUDE>>搜索单行,然后匹配该行上的引用字符串,其他所有内容都将被忽略并在该行上删除。

相关问题