编译原理利用Flex+Bison实现简单计算器
发布时间:2020-12-15 03:44:11 所属栏目:百科 来源:网络整理
导读:编译原理利用Flex+Bison实现简单计算器 一?实验目的 1 、掌握 Yacc 的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器; 2 、使用使用 Yacc 实现一个高级计算器程序; 二?实验内容 实现一个简单的表达式计算器,要求能进行加、减、乘、除
编译原理利用Flex+Bison实现简单计算器 一?实验目的 1、掌握Yacc的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器; 2、使用使用Yacc实现一个高级计算器程序; 二?实验内容 实现一个简单的表达式计算器,要求能进行加、减、乘、除、幂运算,注意优先级。写出详细的步骤和源程序。 1、在linux中安装flex和bison,使用如下命令: ????????sudo?apt-get?install?flex? ????????sudo?apt-get?install?bison? ???2、编写calculator.lex源程序 %{ // 一个简单计算器的Lex词法文件 #include <stdlib.h> #include "calculator.tab.h" void yyerror(char const *); %} %% /* a-z为变量 */ [a-z] { yylval = *yytext - 'a'; return VARIABLE; } /* 整数 */ [0-9]+ { yylval = atoi(yytext); return INTEGER; } /* 运算符 */ [-+()=/*^SCTL%n] {return *yytext;} /* 空白被忽略 */ [ t] ; /* 其他字符都是非法的 */ . yyerror("error 无效的输入字符n"); %% int yywrap(void) { return 1; } 3、编写calculator.y源程序 %{ #include<stdio.h> #include<math.h> #define wypi (0.017453292519943) void yyerror(char const *); int yylex(void); int sym[26]; %} %token INTEGER VARIABLE %left '+' '-' %left '*' '/' %left NEG %left '^' %left 'S' 'C' 'T' %left 'L' %left '%' %% program: program statement 'n' | ; statement: expr {printf("t%dn",$1);} |VARIABLE '=' expr {sym[$1] = $3;} ; expr: INTEGER |VARIABLE{$$ = sym[$1];} |expr '+' expr {$$ = $1 + $3;} |expr '-' expr {$$ = $1 - $3;} |expr '*' expr {$$ = $1 * $3;} |expr '/' expr {$$ = $1 / $3;} |'-'expr %prec NEG {$$ = -$2;} |expr '^' expr {$$ = pow($1,$3);} |'S' expr {$$ = sin($2*(wypi));} |'C' expr {$$ = cos($2*(wypi));} |'T' expr {$$ = tan($2*(wypi));} |'L' expr {$$ = log10($2);} |expr '%' expr {$$ = $1%$3;} |'('expr')' {$$ = $2;} ; %% void yyerror(char const *msg) { fprintf(stderr,"%sn",msg); } int main(void) { printf("a simple calculator.n"); printf("+加、-减、*乘、/除n"); printf("幂运算:a^bn"); printf("S(sin)、C(cos)、T(tan)三角函数:n"); printf("L以10为底的对数运算:logAn"); printf("求余运算%%:n"); yyparse(); return 0; } 4、编译 5、运行 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |