2016-04-15 113 views
0

以下是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。

+0

为什么换行规则返回零?或者甚么事情?它是空白的。噪声。对解析器不重要。 – EJP

回答

1
#define YYSTYPE double 
extern int yylval; 

因此,这是语义类型,intdouble

由于您使用atofprintf("%g", $$),我想你的意图是语义类型是浮点。但是你的声明没有完成:

  • 定义宏YYSTYPE只在解析器中有效。扫描仪从不使用该宏。在解析器中,默认类型是int

  • yylval在解析器中声明(根据该文件中的定义,类型为YYSTYPE)。所以这绝对是一个int和扫描仪中的extern声明是正确的,但不受欢迎。

  • 使用格式代码%g打印int是未定义的行为。事实上,所有数字似乎打印为0.0并不令人意外,但随后与UB没有任何意外。如果编译解析器时甚至启用了编译器警告,这可能是您忽略的警告之一。你应该启用这些警告并认真对待它们;该习惯将帮助你解决自己的问题。

+0

我更新了代码..但仍然没有得到正确的输出 –

+0

@abhilash:我不相信你在做出这些改变之前阅读了我的答案。顺便说一句,在回答问题后改变你的问题是不鼓励的,因为它可能会使答案错误或无关紧要。我在我的答案中更改了“%lf”以符合您的修改,但请不要养成对您的问题进行此类更改的习惯。 – rici