关闭

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

标签: felxbisonyacc
417人阅读 评论(0) 收藏 举报
分类:

实验要求:

参考范例程序, 用 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;  
}  


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:220190次
    • 积分:5261
    • 等级:
    • 排名:第5190名
    • 原创:303篇
    • 转载:4篇
    • 译文:0篇
    • 评论:145条
    博客

    这是我的个人博客Coda

    会和大家分享很多好玩的开源作品

    微信公众号

    这是我的微信公众号

    mayu_stack

    我会在上面与大家分享各种有趣的事物


    最新评论