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
;