2

Flex/Bison で小さなプログラムを作成して、作成したクエリ言語をトークン化/解析しています。Flex/Bison でキーワードを作成する方法があるかどうか疑問に思っていました。

つまり、flex は入力をトークンのリストに分解しますが、キーワードのリストを作成する方法があるので、flex がそれらを検出するたびに「キーワード」という単語が返されます。

または、これを行う唯一の方法は次のとおりです。

"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

行間を読んで実際に何を求めているのかを理解しようとすると、実行時にキーワードを変更できるようにする必要があるようです。すべてのキーワードが共通のパターンに従い、そのパターンに従う他の (キーワード以外の) すべて同じトークンである場合は、ハッシュ テーブルまたは他のルックアップ テーブルを使用できます。ここでは 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トークンを返します。

于 2012-08-13T18:22:02.500 に答える