C / Bison语法错误

时间:2011-08-13 12:47:39

标签: c bison

关于我在野牛的语法,我有一个简短的问题。文件编译,但它没有给出我真正想要的结果。 ; - )

我要解析的示例文件:

L1: ldh [23]

lexer文件如下所示:

...

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); }
    ;

现在我的程序告诉我以下内容:

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

你知道我做错了吗?

非常感谢!

1 个答案:

答案 0 :(得分:3)

你可能错过了规则

":"    { return ':'; }

或词法分析器中的等效内容

如果您使用flex,您可能希望为其提供--nodefault选项,以确保您不会遗漏某些输入令牌。或者,您可以在第一部分中粘贴%option nodefault