2011-08-13 6 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을 붙일 수 있습니다.