我正在Flex / Bison中编写一个小程序来标记/解析我创建的查询语言。 我想知道是否有任何方法可以在Flex / Bison中创建任何关键字。
我的意思是:flex将输入分解为令牌列表,但是有一种方法可以创建一个关键字列表,这样每次flex看到它们都会返回“关键字”这个词。
或以下是唯一的方法:
"dog"|"cat" return KEYWORD;
是否存在flex / bison可以使用的任何数据结构,以便每次看到该数据结构的成员时,它都会将其识别为关键字?
谢谢, 萨拉
答案 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
标记。