2

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

我的意思是:flex 将输入分解成一个标记列表,但是有没有办法创建一个关键字列表,这样每次 flex 看到它们都会返回单词“keyword”。

或以下是执行此操作的唯一方法:

"dog"|"cat"     return KEYWORD;

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

谢谢,莎拉

4

2 回答 2

3

我认为更好的方法是用野牛处理这个问题,如下所示:

在弹性:

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

在野牛中,您设置了接受任何这些令牌的规则:

keyworks: T_DOG | T_CAT | ... ;

other_rule: keyworks T_ACTION;
于 2012-08-13T15:17:41.520 回答
1

试图在字里行间阅读以找出您实际要问的内容,似乎您想要的是能够在运行时更改关键字。如果您的关键字都遵循一个共同的模式,并且遵循该模式的其他(非关键字)都是相同的标记,您可以使用哈希表或其他查找表。我将std::map在这里使用 C++,但您可以使用任何其他允许查找的数据结构:

%{
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标记。

于 2012-08-13T18:22:02.500 回答