0

入力ファイル、.lファイル、.yファイル、および出力は次のとおりです。

問題は、パーサーが方向を再帰的に識別できないことです。

それは最初に識別しています...

ポートとその動作を認識するために同じルールを使用しました

しかし、方向性の場合ではありません。

また、rule(coutステートメント)に関連付けられた.yファイルコードも表示されません。

入力ファイル 。

start a b c d                //ports

a:O b:I c:B d:O    //direction of ports

.lファイル

[\t]+                   {}

[\n]  {line_num++; cout"line_num:" line_num; }

start                   {  cout< "beggining of file"; return START;}



[a-zA-Z0-9_\-]+:[IOB]    {cout<<"\ndirection:" << strdup(yytext); return DR; }

[a-zA-Z0-9_\-]+     {cout<<"\nfound name:" strdup(yytext); return NAME;}

.yファイル文法

doc : START ports dir

ports : NAME ports  { cout<<"\port in .y" $1;}

        | NAME    { cout<<"\nport in .y" $1;}
        ;


dir : DR dir       { cout<<"\ndirection in .y" $1;}

    | DR            { cout<<"\ndirection in .y"<<$1;    }
    ;

出力はです。

ファイルの先頭

found name:a

found name:b

found name:c 

found name:d

 line no-2

direction:a:O
4

1 に答える 1

1

あなたが犯している唯一の明らかなエラーはyylval、フレックスアクションでの値を設定していないことです。したがって$1、すべてのバイソンアクションで初期化されていない値があります。フレックス アクションは次のようになります。

[a-zA-Z0-9_\-]+     { yylval = strdup(text);
                      cout  <<  "\nfound name:" << yylval;
                      return NAME;
                    }

DRまた、トークンのタイプがでNAMEあることを必ず指定してくださいconst char *

free()最後に、弦が不要になった場合は、弦を忘れないでください。

于 2013-02-27T13:05:51.863 に答える