2011-08-13 47 views
4

我有一个关于我的野牛语法的简短问题。文件编译,但它并没有给我实际想要的结果。 ;-)C/Bison语法错误

,我想分析

我的示例文件:

L1: ldh [23] 

词法分析器文件看起来是这样的:

... 

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 ':'! 

你知道我做错了什么吗?

非常感谢!

+0

你是如何定义do_label和do_ldh的? –

+2

您的词法分析器是否生成':'令牌? –

+0

您可能不希望'label_me'的定义之后和使用'{label_me}'之后的加'+'。至少,它不必要地使事情复杂化,即使结果是相同的。 –

回答

3

你可能缺少规则

":" { return ':'; } 

或等价的东西在你的词法分析器

如果您正在使用flex,你可能想给它--nodefault选项,以确保你不错过一些输入令牌。或者,您可以在第一部分中粘贴%option nodefault