编译原理 - 在 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;  
}  


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

如何在Windows下面使用bison

1、到Google搜索“bison windows”,应该可以看到这个网站: http://gnuwin32.sourceforge.net/packages/bison.htm 它是专门将GNU的工...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

[ZZ]bison flex for windows 使用说明

you will need the lastest versions of: flex-2.5.4a-1.exe bison-2.4.1-setup.exe Afte...

windows 下 bison 命令行调用

目标:将bison集成到Visual studio中 做法:以cygwin下bison为例。 1.新建一个批处理文件 bison.bat,内如如下: @set bison_dir="E:/SDK/cy...

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

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

Flex&Bison Tips - 如何改善 flex & bison 在VC下的编辑环境

我在VC下安装VC助手(VisualAssistX), 让它可以高亮显示C/C++语法,同时支持快捷跳转、自动联想、简单重构等功能。 1. 将flex的输入文件命名为后缀 .cpp, 但是将这个.cp...

SQL Server从入门到精通pdf

下载地址:网盘下载 内容介绍 编辑 《SQL Server 从入门到精通》从初学者的角度出发,通过通俗易懂的语言、丰富多彩的实例,详细地介绍了SQLServer2...

编译原理课设之简单编译器实现

编译器源代码

编译原理:用flex和bison实现一个简单的计算器

运用flex和bison工具实现一个简单的计算器,可以进行+、-、*、/等运算。 flex源代码格式: declarations %% translation rules %% auxil...

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

目标:参考范例程序, 用 Flex 和 Bison 实现一个功能更为强大的计算器,包含以下运算: a) 加、减、乘、除运算 b) 乘方、开方运算 c) 位运算 – 与 & 、或 |、非 ~… ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编译原理 - 在 Windows 平台下使用 Flex 和 Bison
举报原因:
原因补充:

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