2011-08-13 5 views
4

バイソンの文法に関する短い質問があります。ファイルはコンパイルされますが、実際に欲しかった結果は得られません。 ;-)私が解析したいC/Bison文法エラー

マイファイルの例:

... 

digit   [0-9] 
digit_s   [1-9] 
digit_n   [0] 
hex    [a-fA-F0-9] 
hex_x   [x] 
number_dec  {digit_n}|{digit_s}{digit}* 
number_hex  {digit_n}{hex_x}{hex}+ 
label_s   [a-zA-Z] 
label_me  [a-zA-Z0-9_]+ 
label   {label_s}{label_me}+ 

%% 

"ldb"   { return OP_LDB; } 
"ldh"   { return OP_LDH; } 
... 

{number_hex} { yylval.number = strtoul(yytext, NULL, 16); 
        return number_hex; } 

{number_dec} { yylval.number = strtoul(yytext, NULL, 10); 
        return number_dec; } 

{label}   { yylval.label = xstrdup(yytext); 
        return label; } 

このようなバイソンファイル:

... 
%} 

%union { 
    int number; 
    char *label; 
} 

%token OP_LDB OP_LDH ... 
%token number_hex number_dec label 
%type <number> number_hex number_dec number do_ldb 
%type <label> label do_label 

%% 

prog 
    : {} 
    | prog line { } 
    ; 

line 
    : instr { } 
    | labeled_instr { } 
    ; 

labeled_instr 
    : do_label instr { } 
    ; 

instr 
    : do_ldb { } 
    | do_ldh { } 
    ... 
    ; 

number 
    : number_dec { $$ = $1; } 
    | number_hex { $$ = $1; } 
    ; 

do_label 
    : label ':' { info("got:%s\n", $1); } 
    ; 

do_ldb 
    : OP_LDB '[' 'x' '+' number ']' { info("got:%d\n", $5); } 
    | OP_LDB '[' number ']' { info("got:%d\n", $3); } 
    ; 

L1: ldh [23] 

レクサー・ファイルは次のようになります今私のプログラムは私に次のように伝えます:

Syntax error at line 1: ldh! syntax error, unexpected OP_LDH, expecting ':'! 

私が間違っていたことはありますか?

大きな感謝!あなたのレクサーで

+0

どのようにdo_labelとdo_ldhを定義しましたか? –

+2

レクサーが ':'トークンを生成していますか? –

+0

おそらく、 'label_me'の定義の後と' {label_me} 'の使用の後にプラスの' + 'が両方とも必要ではないでしょう。少なくとも結果が同じであっても、不必要に複雑なものになります。 –

答えて

3

おそらくルールが欠落している

":" { return ':'; } 

または同等の何か

あなたがflexを使用している場合は、おそらくそれをあなたがいないことを確実にする--nodefaultオプションを与えたいですいくつかの入力トークンがありません。または、%option nodefaultを最初のセクションに貼り付けることもできます。

関連する問題