C 为什么生成的解析器出现语法错误?

C 为什么生成的解析器出现语法错误?,c,grammar,bison,yacc,lex,C,Grammar,Bison,Yacc,Lex,我试图写一个简单的语法,它接受这种形式的语句 7 = var int 9 = abc float 但是对于下面的LEX和YACC代码,生成的解析器会出现语法错误(调用yyerror) 法律:--- 雅克:--- 您需要在lex文件中为'='定义一个标记,并在语法定义中使用其终端符号名,而不是'=' [0-9]+ { yylval.num = atof(yytext); return NUM; } "int" return INT; "float"

我试图写一个简单的语法,它接受这种形式的语句

     7 = var int
     9 = abc float
但是对于下面的LEX和YACC代码,生成的解析器会出现语法错误(调用yyerror)

法律:---

雅克:---


您需要在lex文件中为
'='
定义一个标记,并在语法定义中使用其终端符号名,而不是
'='

[0-9]+      { yylval.num = atof(yytext); return NUM; }
"int"       return INT;
"float"     return FLOAT;
[a-z]+      {  yylval.str = strdup(yytext); return ID; }
\n              /* Ignore end of lines */
[ \t]+          /* Ignore white spaces and tabs */
"="         return ASSIGN;

不需要定义符号常量,实践也各不相同,但需要有一个规则来返回
=
(可以是
'='
)的标记。您可以为这些标记创建一个字符类,然后返回yytext[0]
%% 
commands: /* empty */
    | commands command
    ;                                                                                     

command:                                                                                  
    int_exp
    |                                                                                     
    float_exp
    ;                                                                                     

int_exp: exp INT                                                                        
    ;                                          

float_exp: exp FLOAT
    ;

exp : NUM '=' ID
    ;

%%
[0-9]+      { yylval.num = atof(yytext); return NUM; }
"int"       return INT;
"float"     return FLOAT;
[a-z]+      {  yylval.str = strdup(yytext); return ID; }
\n              /* Ignore end of lines */
[ \t]+          /* Ignore white spaces and tabs */
"="         return ASSIGN;
exp : NUM ASSIGN ID
    ;