2011-06-24 5 views
1

私はフレックスを学ぼうとしています& Bison。私は材料を読んだことがあり、理論的レベルでどのように機能するのか理解しています。しかし、私は精神的なブロックを打つことなく、最も基本的なものを実装するように見えることはできません。 (注:私はコンパイラコースなどを取っていません...これは私の最初のものです。私は、この基本的なものが実装されたことを見れば、ずっと簡単に移動して理解することができると思います。フレックス&ビソンを使用

基本的に、私がしようとしているのは、type my_type /// some textを見ると、my_typeの "set_text"という関数を呼び出し、そのコメントの後ろにあるものにテキストを設定するプログラムを書くことだけです。むしろ私のBisonの文法は関数を呼び出すでしょうmy_type.set_text(some text);私はFlexとBisonを使わなくても簡単にこれを行うことができたことを理解していますが、そのポイントは学ぶことです。

私はすでにファイルを正しく設定しています...私が実装する必要があるのは、(Flexからの)トークンとBisonから取られたアクションです。これまで

マイフレックストークンパッシング:

"\/"{3}    { return COMMENT; } 

私のバイソンは、これまで

%token COMMENT 

つかむトークンとそれはすべて私が思い付くことができます真剣です。私は他に何が必要なのか知っている...私はそれを行う方法を理解することはできません。私は私が必要であることを知っている:
は、a)の機能の正しい機能

すべてのヘルプにこのようなものを処理し、呼び出すためにバイソンの「ルール」を思い付く何か
b)のようなタイプとmy_typeを渡すために?すでに私は離れていますか?

UPDATE(これを行う方法について、さらに思考): たぶん私のバイソンファイルはこのように私のFlexファイルはそれをこれらのトークンを渡す必要があるでしょう

commented_variable:       {($2).set_text($4);} 
    IDENTIFIER NAME COMMENT COMMENT_TEXT      

のようなルールを含める必要がありますか?正しい軌道にいるのですか?

+0

これはでこれを投稿する間違ったフォーラムのように思える私はどのサイトがより適切な見つけることができなかった場合にも、私は謝罪。別のスタックエクスチェンジサイトがより良い選択だったと思うかどうか教えてください! –

答えて

1

私はいくつかのものをお勧めします。 flexの開始条件を使用してCOMMENTと​​ を個別に処理することはできませんが、 を一度に処理する方が簡単だと思います。
bisonソースは、次の(架空のコード)のようになります:

%union { 
    name_type *name; 
    char const *comment; 
} 
%token <name> NAME 
%token <comment> COMMENT 
%% 
commented_variable: IDENTIFIER NAME COMMENT {$2->set_text($3);} 

字句観点から、あなたのIDENTIFIERNAMEは区別できないようです。 私はそれらをユーザコードで(レキシカルではなく)ソートしました。 flex源は、以下のようになる:

"///".*     { 
         yylval.comment = strdup(yytext + 3); 
         return COMMENT; 
         } 
[A-Za-z_][A-Za-z_0-9]* { 
         name_type *n = lookup_name(yytext); 
         if (n) { 
          yylval.name = n; 
          return NAME; 
         } 
         return IDENTIFIER; 
         } 

しかしながら、上記のコードはまだ適切なname_typelookup_nameを必要とfreestrdupから返されたポインタをする。
flex/bisonに多くの経験がない場合は、最初に レクサーを十分に確認することをおすすめします。例えば、私は期待トークンが同様
int main() { while (yylex()) {} }

"///".*     printf("comment %s\n", yytext); 
[A-Za-z_][A-Za-z_0-9]* printf("symbol %s\n", yytext); 

のような簡単なコードで を認識していることを確認し、bisonコードのように、私が最初にシフト/削減紛争のような文法的 問題を解決し、確認をお勧めします を提案します文法は のような単純なコードで正しく認識されていること:。

commented_variable: IDENTIFIER NAME COMMENT { puts("OK"); } 
0

は、あなたが実際に区切り以下のテキストを使用していることを考えると、私はないあなたは上記の持っている何のために単語「コメント」を使用します。つまり、あなたがアップデートに加えたことは、かなり正しい考えです。

+0

あなたはこれをさらに説明できますか?私は本当にあなたが何を意味するかは分かりません。 –

関連する問題