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 ':'!
내가 뭘 잘못했는지 아십니까?
큰 감사!
어떻게 do_label과 do_ldh를 정의 했습니까? –
렉서가 ':'토큰을 생성합니까? –
아마도 'label_me'의 정의와 '{label_me}'의 사용 후에 '+'가 더하기를 원하지 않을 것입니다. 적어도 결과가 같더라도 불필요하게 상황을 복잡하게 만듭니다. –