编译原理 - 在 Windows 平台下使用 Flex 和 Bison

原创 2016年06月01日 17:50:54

实验要求:

参考范例程序, 用 Flex 和 Bison 实现一个功能更为强大的计算器,包含以下运算:

a) 加、减、乘、除运算

b) 乘方、开方运算

c) 位运算– 与 & 、或 |、非 ~...

d) 阶乘运算 ! 

源代码:

calc.lex:

%{  
    /*  
     *  一个简单计算器的Lex词法文件  
     */  
    #include <stdlib.h>  
      
    void yyerror(char*);  
%}  
  
%%  
  
     /* a-z为变量 */     
[a-z]   {  
            yylval = *yytext - 'a';  
            return VARIABLE;  
        }  
  
    /* 整数 */  
[0-9]+  {  
            yylval = atoi(yytext);  
            return INTEGER;  
        }  
  
    /* 运算符 */  
[-+()=/*^#&|~SCTLEN%\n] {return *yytext;}  
  
    /* 空白被忽略 */  
[ \t]    ;  
  
    /* 其他字符都是非法的 */  
.    yyerror("无效的输入字符");  
  
%%  
  
int yywrap(void)  
{  
  return 1;  
}  

clac.y:

%token    INTEGER VARIABLE  
%left    '+' '-'  
%left    '*' '/'  
%left    '^' '#'  
%left    '&' '|' '~'  
%left    'S' 'C' 'T'  
%left    'L'  
%left    'E'  
%left    'N'  
%left    '%'  
%{  
    #define YYSTYPE double  
    #define  __STDC__   0   
    #define wypi (0.017453292519943)  
    #include "calc.tab.h"   
    #include "math.h"     
    void yyerror(char*);  
    int yylex(void);  
    double sym[26];  
%}  
  
%%  
  
program:  
    program statement '\n'  
    |  
    ;  
statement:  
     expr           {printf("%f\n", $1);}  
     |VARIABLE '=' expr {sym[(int)$1] = $3;}  
     ;  
expr:  
    INTEGER  
    |VARIABLE       {$$ = sym[(int)$1];}  
    |expr '+' expr      {$$ = $1 + $3;}  
    |expr '-' expr      {$$ = $1 - $3;}  
    |expr '*' expr      {$$ = $1 * $3;}  
    |expr '/' expr      {$$ = $1 / $3;}  
    |expr '^' expr      {$$ = pow($1,$3);}  
    |expr '#' expr      {$$ = pow($3,1.0/$1);}  
    |expr '&' expr      {$$ = (int)($1)&(int)($3);}  
    |expr '|' expr      {$$ = (int)($1)|(int)($3);}  
    |'~' expr      {$$ =!$2;}  
    |'S' expr      {$$ = sin($2*wypi);}  
    |'C' expr      {$$ = cos($2*wypi);}  
    |'T' expr      {$$ = tan($2*wypi);}  
    |'L' expr      {$$ = log10($2);}  
    |'E' expr      {$$ = log($2);}  
    |expr 'N'      {  
                $$ = 1;  
                while($1>1)  
                {  
                    $$ *=$1;  
                    $1--;  
                }  
  
           }  
    |expr '%' expr {  
            $$=(int)($1)%(int)($3);  
           }  
    |'('expr')'     {$$ = $2;}  
    ;  
  
%%  
  
void yyerror(char* s)  
{  
    fprintf(stderr, "%s\n", s);  
}  
  
#include "lex.yy.c"  
  
int main(void)  
{  
    printf("运算规则:\n");  
    printf("+加、-减、*乘、/除\n");  
    printf("^乘方(a^b a的b次方)、#开方(a#b 即b开a次方)\n");  
    printf("&与、|或、~非\n");  
    printf("N求阶乘 (3N 求3的阶乘)\n");  
    printf("三角函数:S (sin)、C (cos)、T (tan)\n");  
    printf("L以10为底的对数、E以e为底的对数\n");  
    printf("求模%% \n");  
    yyparse();  
    return 0;  
}  


版权声明:本文为博主原创文章,未经博主允许不得转载,复制。

Win flex-bison 的简单使用

Win flex-bison 提供了 flex bison for Windows 的另外一种移植,将GNU m4宏处理器源代码集成进win flex-bison,不依赖Msys,Msys2,Cygw...
  • gocad
  • gocad
  • 2014年03月23日 12:20
  • 5865

编译原理—(从零开始)用flex、bison实现一个简单的计算器

目标:参考范例程序, 用 Flex 和 Bison 实现一个功能更为强大的计算器,包含以下运算: a) 加、减、乘、除运算 b) 乘方、开方运算 c) 位运算 – 与 & 、或 |、非 ~… ...
  • qq_35208390
  • qq_35208390
  • 2017年10月16日 14:14
  • 757

编译原理:用Flex和 Bison实现一个功能更为强大的计算器

 用Flex和 Bison实现一个功能更为强大的计算器,包含以下运算: a)  加、减、乘、除运算 b)  乘方、开方运算 c)  位运算       ...
  • nufangdongde
  • nufangdongde
  • 2016年04月20日 11:18
  • 1148

编译原理--计算器Flex+Bison实现

编译原理试验程序计算器实现
  • wangyang1354
  • wangyang1354
  • 2013年12月12日 22:29
  • 4032

编译原理利用Flex+Bison实现简单计算器

编译原理利用Flex+Bison实现简单计算器
  • xiaofeige567
  • xiaofeige567
  • 2014年06月03日 21:38
  • 3806

GNU Flex与Bison结合使用

Bison适合上下文无关文法(Context-free grammar),并采用LALR(1)算法的文法。当bison读入一个终结符(token),它会将该终结符及其语意值一起压入堆栈。这个堆栈叫做分...
  • Chinamming
  • Chinamming
  • 2013年11月26日 23:12
  • 7097

在windows下安装flex和bison

这两天为了项目而要学习一下编译原理中要用到得两个工具,flex和bison。这两个软件是可以在windows下运行和编译得,之前也在网上查了不少资料,终于昨天下载了下来。今天来安装,装完了不知道要怎么...
  • sk_Overlord_knife
  • sk_Overlord_knife
  • 2016年05月22日 09:45
  • 3510

编译器工具 Flex Bison for Windows 简单入门例子

最近从事一个系统仿真软件的开发,里面定义了自己的描述性语言MSL, MSL语言经FlexBison转换成C语言,然后用C编译器来编译并计算仿真。 现在领域驱动开发比较热门,有机会定义自己的语言对程序员...
  • Chinamming
  • Chinamming
  • 2013年11月26日 22:57
  • 6050

【原创】让VS2015与Win Flex Bison共舞

时光荏苒,岁月如梭!很久很久没有更新博客了,很多要写的东西都只是开了个头,或者只写了一小部分因不完整而无法发布,实在遗憾。无奈时间实在是太紧张,大量时间都用在了看书、学习和工作上,不能快意自在的笔耕以...
  • u014038143
  • u014038143
  • 2017年10月10日 14:23
  • 277

WINDOWS下bison和flex的使用

以一个简单计算器为例 mycalc.l %{ #include #include "y.tab.h" int yywrap(void) { return 1; } %} %% "+" ...
  • Griffin_0
  • Griffin_0
  • 2016年09月05日 20:46
  • 518
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理 - 在 Windows 平台下使用 Flex 和 Bison
举报原因:
原因补充:

(最多只允许输入30个字)