加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

编译原理利用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、运行

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读