Flex-Bison:如何创建关键字?

时间:2012-04-24 15:46:39

标签: bison flex-lexer

我正在Flex / Bison中编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在Flex / Bison中创建任何关键字。

我的意思是:flex将输入分解为令牌列表,但是有一种方法可以创建一个关键字列表,这样每次flex看到它们都会返回“关键字”这个词。

或以下是唯一的方法:

"dog"|"cat"     return KEYWORD;

是否存在flex / bison可以使用的任何数据结构,以便每次看到该数据结构的成员时,它都会将其识别为关键字?

谢谢, 萨拉

2 个答案:

答案 0 :(得分:3)

我认为一个更好的方法是你用野牛处理这个,就像这样:

在flex中

"dog" { return T_DOG; }
"cat" { return T_CAT; }
...

并且在野牛中你提出了一个接受任何这些令牌的规则:

keyworks: T_DOG | T_CAT | ... ;

other_rule: keyworks T_ACTION;

答案 1 :(得分:1)

尝试在各行之间进行读取以找出您实际要求的内容,看起来您想要的是能够在运行时更改关键字。如果您的关键字都遵循通用模式,并且遵循该模式的其他(非关键字)都是相同的标记,则可以使用哈希表或其他查找表。我将在这里使用C ++ std::map,但您可以使用任何其他允许查找的数据结构:

%{
extern std::map<std::string, int> keyword_table;
%}
%%

[A-Za-z_$][A-Za-z_$0-9]*    { auto k = keyword_table.find(std::string(yytext));
                              if (k != keyword_table.end())
                                  return k->second;
                              return T_IDENTIFIER; }

现在,您可以将带有关联标记的任何标识符粘贴到keyword_table中,词法分析器将识别该关键字并返回相应的标记。任何未被识别为关键字的标识符(不在表中)都将返回T_IDENTIFIER标记。