- 论坛徽章:
- 0
|
本帖最后由 一刀。 于 2012-11-12 17:46 编辑
初学lex和yacc,书上有两个例子,一个是使用优先规则的运行没有问题,另一个不使用优先规则的死活跑不过去,甚至连乘法除法都有问题,请大牛指教一下
下面这个是词法分析程序- %{
- #include "y.tab.h"
- extern int yylval;
- %}
- %%
- [0-9]+ { yylval = atoi(yytext); return NUMBER; }
- [ \t]+ ;
- \n return 0;
- [_a-zA-Z][_a-zA-Z0-9]* { return NAME; }
- [=\*\/\(\)\+\-] { return yytext[0]; }
- %%
复制代码 下面这个是使用有限规则的语法分析程序,运行没有问题- %{
- #include <stdio.h>
- %}
- %token NAME NUMBER
- %left '-' '+'
- %left '*' '/'
- %nonassoc UMINUS
- %%
- statement: NAME '=' expression
- | expression { printf("= %d\n", $1); }
- ;
- expression: expression '+' expression { $$ = $1 + $3; }
- | expression '-' expression { $$ = $1 - $3; }
- | expression '*' expression { $$ = $1 * $3; }
- | expression '/' expression
- {
- if($3 == 0)
- yyerror("divide by zero");
- else
- $ = $1 / $3;
- }
- | '-' expression %prec UMINUS { $$ = -$2; }
- | '(' expression ')' { $$ = $2; }
- | NUMBER { $$ = $1; }
- ;
- %%
- extern FILE *yyin;
- int main()
- {
- do
- {
- yyparse();
- }
- while(!feof(yyin));
- }
复制代码 下面这个是不使用优先规则的程序,乘法、除法和小括号都有问题- %{
- #include <stdio.h>
- %}
- %token NAME NUMBER
- %%
- statement: NAME '=' expression
- | expression { printf("= %d\n", $1); }
- ;
- expression: expression '+' mulexp { $$ = $1 + $3; }
- | expression '-' mulexp { $$ = $1 - $3; }
- | primary { $$ = $1; }
- ;
- mulexp: mulexp '*' primary { $$ = $1 * $3; }
- | mulexp '/' primary
- {
- if($3 == 0)
- yyerror("divide by zero");
- else
- $$ = $1 / $3;
- }
- | primary
- ;
- primary: '(' expression ')' { $$ = $2; }
- | '-' primary { $$ = -$2; }
- | NUMBER { $$ = $1; }
- ;
- %%
- extern FILE *yyin;
- int main()
- {
- do
- {
- yyparse();
- }
- while(!feof(yyin));
- }
复制代码 |
|