0

私はこのようなルールを持っています:

A --> a B C dここで、 a, dは終端記号であり、B, Cは非終端記号です。

B -->   a1 | a2 | a3
C -->   a4 | a5 | a6

私はバイソンでこのルールを書いています:

  my_rule:
            a B C d   {   handler->handle_B_C(handle_B($2), handle_C($3)); }
  B :
      a1 { $$ = ONE; }
    | a2 { $$ = TWO; }
    | a3 { $$ = THREE; }
    ;
  C:
         a4 { $$ = FOUR; } 
      | a5  { $$ = FIVE; }
      | a6  { $$ = SIX  }

このルールを次のように書きたいと思います。

   A --> a B
   A --> errorCase
   B --> a1 C | a2 C | a3 C
   B --> errorCase
   C --> a4 D | a5 D | a6D
   D --> d
   D -->errorCase

しかし、バイソンでの書き方がわかりません。バイソンで書くのを手伝ってくれる人はいますか?(B と D の値を取得する方法がわかりません)

4

1 に答える 1

1

次の文法は、yacc(BSD) で問題なく受け入れられます。bison(Linux) でも動作するはずです。

一般的な慣例により、トークンは通常大文字で、ルールは小文字で表されます。

%token A A1 A2 A3 A4 A5 A6 A7 D

%%

a
    : A b {
        $$ = node($1, $2);
    }
    ;

b
    : A1 c {
        $$ = node($1, $2);
    }
    | A2 c {
         $$ = node($1, $2);
    }
    | A3 c {
         $$ = node($1, $2);
    }
    ;

c
    : A4 d {
         $$ = node($1, $2);
    }
    | A5 d {
         $$ = node($1, $2);
    }
    | A6 d {
         $$ = node($1, $2);
    }
    ;

d
    : D {
        $$ = node($1);
    }
    ;
%%

#include <stdio.h>

void yyerror(const char *s)
{
    fflush(stdout);
    fprintf(stderr, "*** %s\n", s);
}
于 2013-10-16T03:16:26.593 に答える