lex,yacc easy calulator

%{
#include "y.tab.h"
extern vbltable[26];
%}
%option noyywrap
%%
[1-9][0-9]*|0|([0-9]+\.[0-9]+) {yylval.dval = atof(yytext); return NUMBER;}
[ \t]	;
[a-z]+  {yylval.vblno = yytext[0] - 'a'; return NAME;}
\n 	return 0;
.  	return yytext[0];
%%



%{
#include <stdio.h>
#include <stdlib.h>
  double vbltable[26];
  %}

%union{
  double dval;
  int vblno;
 }

%token <vblno> NAME
%token <dval>  NUMBER
%type <dval> expression 
%left '-' '+'
%left '*' '/'
%nonassoc UMIUS

%%
statement: NAME '=' expression   {vbltable[$1] = $3;}
|  expression {printf(">>%f\n",$1);}
;

expression :
		expression '+' expression {$$ = $1 + $3;}
	|  	expression '-' expression {$$ = $1 - $3;}
	| 	expression '*' expression {$$ = $1 * $3;}
	| 	expression '/'  expression {
  			if ($3  == 0)
   			 {
      				yyerror("diveded by zero");
    			}
  			else
   				 $$ = $1 / $3;

			  }
	|      '('expression')' {$$ = $2;}
	| 	NUMBER
	| 	NAME  {$$ = vbltable[$1];}
;
%%
int
yyerror (char const *str)
{
  extern char *yytext;
  fprintf(stderr,"parser error near str: %s; yytext: %s\n",str,yytext);
  return 0;
}
void main()
{
  extern int yyparse(void);
  extern FILE *yyin;
  yyin = stdin;
  while(1){
    if (yyparse()){
      exit(1);
    }
  }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值