2

Flex と bison を使用してセマンティック アナライザーを作成しています。そこに、[1,2,3;3,4;5] のような行列リテラルがあります。それらが整数であると仮定します。次のルールがあります。

フレックスファイル:

int {yylval.type_id.Type=1;return tINTTYPE;}

バイソンファイルで:

char m[80]; //to keep the value of matrix literal

%union semrec
{
    struct
    {
       int Type;
       char *id;
    }type_id;
}

matrixLit : '[' row ';' rows ']'

row : value
      | value ',' row

rows : row           
       | row ';'  rows 

value : tINT      {$$.id=$1.id;}
  | tREAL      {$$.id=$1.id;}  
  | tIDENT   {$$.id=$1.id;}   

これらを使用して、行列リテラルの値を取得しようとしています。たとえば、行列リテラルが [1;2;3,4;5,6] の場合、1;2;3,4;5,6 を取得しようとします。$$.id=$1.id と strcat(m, $1.id), strcpy(m,$1.id) などを使用して何かを試しましたが、何をしても、この順序で値を取得できません。4,2;1;3,5,6 のような結果が得られます。誰でもこれで私を助けることができますか?

ありがとう

4

1 に答える 1

3

手始めに、バイソンでは常に左再帰を使用してください。Bison のパーサーはツリーの左側を折りたたむことができ、より高速で効率的なパーサーを作成します。

行列リテラルが空であることは違法であると仮定します。これがあなたが望む動作でない場合は、少しいじる必要があります。

%type <list> rows row
%%
matrixLit : '[' rows ']'

rows :  row            { $$ = create_list();  $$->add($1); }
     |  rows ';' row   { $$->add($3); }   
     ;  

row  : value           { $$ = create_list(); $$->add($1); }
     | row ',' value   { $$->add($3); }
     ;

バイソンユニオンにある種のリストタイプを追加する必要があります。Rows は行エントリのリストで、row は値エントリのリストです。

于 2013-04-11T18:46:24.727 に答える