【发布时间】:2016-04-15 11:11:28
【问题描述】:
以下是yacc代码:
%{
#include<stdio.h>
#include<math.h>
%}
%token NUMBER
%left '-' '+'
%left '*' '/'
%nonassoc UMINUS
%%
statement:expression {printf("Answer=%g\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;}
;
%%
int main(void)
{
printf("Enter the Expression");
yyparse();
printf("\n\n");
return 0;
}
int yyerror(char *error)
{
printf("%s\n",error);
return 0;
}
以下为法码:
%{
#include<stdio.h>
#include "y.tab.h"
#define YYSTYPE double
extern int yylval;
%}
%%
[0-9]+|[0-9]*\.[0-9]+ { yylval=atof(yytext); return NUM;}
'\n' { return 0;}
'\t' {}
. {return yytext[0]; }
%%
int yywrap()
{
return 1;
}
我编译了 lex 和 yacc 代码。除了一些警告外,没有明显的错误。但是当我运行可执行文件时,它没有显示任何值,而是 0.000000。
【问题讨论】:
-
为什么换行规则返回零?或者确实是什么?是空格。噪音。对解析器不重要。
标签: bison flex-lexer yacc lex