如何从Flex中的文件读取规则(定义)?

时间:2019-05-08 14:10:37

标签: c flex-lexer

我一直在.l文件中创建令牌定义。由于数据集的数量很大,因此变得很乏味。 有什么方法可以从文件中读取所有单词,例如包含所有名词的名词.txt,并给所有名词一个标记。

基本上,我想使这部分自动化:

%%

[\r\n]                  {;return T_QUIT;}
"morning"|"flight"      {return NOUN;}
"I"|"him"                       {return PRO;}
"a"                     {return DET;}
"prefer"|"play"|"love"              {return VERB;}
"Los Angeles"|"ali"|"home"  {return PNOUN;}
"on"|"at"                   {return PRE;}
"exit"      {return T_QUIT;}
"quit"      {return T_QUIT;}

%%

2 个答案:

答案 0 :(得分:1)

flex 会生成代码,因此您无法在执行时读取noun.txt,如果期望的话,请直接由 flex 对其进行管理

当然,您可以使用 flex 来读取标识符/单词(字母序列)并管理由于noun.txt而已知的名词(已经读取并记住其内容以供使用)以特殊方式进入与标识符关联的主体部分({...})。但是在那种情况下,使用 flex 的兴趣非常有限,并且在“洛杉矶”内部有空间的情况下您会遇到问题(但可能是“洛杉矶”吗?)

您还可以编写一个生成器,从noun.txt生成flex文件,以使其直接由 flex 管理。如果不必随时更改名词,这可能是最好的方法。您的 flex 定义非常简单且易于生成。

答案 1 :(得分:0)

您可能会找到命令

sed 's/^/"/; s/$/"|/' noun.txt >> nounrule.txt

有用。这基本上为您编写了大部分规则,您只需要在最后添加操作部分即可。