使用LEX&YACC设计一个计算器的例子

calc.l

%{
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include "calc.tab.h"
%}

%option noyywrap

%%
([0-9])+|([0-9])*"."([0-9])+    { yylval = atof( yytext ); /*printf("yytext:%s, yylval:%f/n", yytext, yylval);*/ return NUM; }
[ /t]+
"/n"                            { return '/n'; }
.                               { return *yytext; }

%%

 calc.y

%{
 #define YYSTYPE double
 #include <math.h>
 #include <stdio.h>
 int yylex (void);
 void yyerror (char const *);
%}

/* Bison declarations.  */
%token NUM
%left '-' '+'
%left '*' '/'
%left NEG     /* negation--unary minus */
%right '^'    /* exponentiation */

%% /* The grammar follows.  */
input:    /* empty */
       | input line
;

line:     '/n'
       | exp '/n'  { printf ("%f/n", $1); }
;

exp:      NUM                { $$ = $1;          /*printf("%f = %f/n", $$, $1);*/              }
       | exp '+' exp        { $$ = $1 + $3;      /*printf("%f = %f + %f/n", $$, $1, $3);*/     }
       | exp '-' exp        { $$ = $1 - $3;      /*printf("%f = %f - %f/n", $$, $1, $3);*/     }
       | exp '*' exp        { $$ = $1 * $3;      /*printf("%f = %f * %f/n", $$, $1, $3);*/     }
       | exp '/' exp        { $$ = $1 / $3;      /*printf("%f = %f / %f/n", $$, $1, $3);*/     }
       | '-' exp  %prec NEG { $$ = -$2;          /*printf("%f = -%f/n", $2);*/                 }
       | exp '^' exp        { $$ = pow ($1, $3); /*printf("%f = pow(%f, %f)/n", $$, $1, $3);*/ }
       | '(' exp ')'        { $$ = $2;           /*printf("%f = (%f)/n", $$, $2);*/            }
;
%%


然后使用FLEX, BISON生成C源程序

flex calc.l -->lex.yy.c
bison -d calc.y -->calc.tab.c(-d生成头文件calc.tab.h给calc.l使用)

然后在calc.tab.c加入:

int main()
{
 return yyparse();  //调用语法分析yyparse
}

void yyerror(char const *s)
{
 fprintf(stderr, "%s/n", s); //语法分析出错显示
}

使用VC编译生成calc.exe运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值