编译原理 - 在 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下安装lex(flex)与yacc(bison)

上完第一节编译原理,Mr李要求这周自己探索一下lex和yacc这两个工具。         查了一下lex与yacc是两个在Unix下的分别作词法分析和语法分析的工具,都说很强大。而他俩在linux下...

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

编译原理试验程序计算器实现

编译原理—Lex和Bison实现计算器

calc.lex文件 %{ /* * 一个简单计算器的Lex词法文件 */ #include #include void yyerror(...

编译原理-用Bison构造语法分析程序-小小计算器

问题描述: 编译原理实验要求构造语法分析程序,实现一个简单计算器的功能 实现功能: 1,基本运算 a) 加、减、乘、除 b) 乘方、开方 c) 位运算:与、或、非 d) 阶乘运算 e) 三角函数运...

[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下Lex和yacc使用

在windows上初步配置和使用Lex和yacc的步骤如下,首先下载flex和bison。网址是http://pan.baidu.com/s/1dDlfiW5 并解压。 为了方便,如果安装了VS20...

编译原理 - 用FLEX自动构造词法分析程序

一、实验目的 1.  学习使用词法分析程序自动构造工具Flex 2.  熟悉LEX源程序语法 3.  掌握词法分析程序的自动构造方法 二、实验平台 Windows+ Flex  三、基础内容...

编译原理-用FLEX构造词法分析程序

实验内容: ★★ 输入一个C 源程序文件, 用FLex 实现以下任务 a) 添加行号。 b) 将文件中每个非空的空白符号序列替换为单个空格。 c) 将文件中所有关键字转换为大写字母。 d) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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