首页 > 代码库 > 【FLEX&YACC】第二天制作一个简单计算器

【FLEX&YACC】第二天制作一个简单计算器

首先写词法分析器:

词法分析器要返回记号:

“+” 返回ADD

“-” 返回SUB

“*” 返回MUL

“/” 返回DIV

输入的实数全部被当作double类型处理

换行符返回CR

calc.l:

%{
#include <stdio.h>
#include "y.tab.h"
int yywrap(void){ /*免链接库文件*/
    return 1;
}
%}
%%
[ \t]    { ;}
"+"        return ADD; /*对加号的处理*/
"-"        return SUB;    /*减号*/
"*"        return MUL; /*乘号*/
"/"        return DIV; /*除号*/
"\n"    return CR;    /*换行符*/
([0-9]+\.[0-9]+)|0|([1-9][0-9]*)    {
    /*实数的处理*/
    double temp;
    sscanf(yytext,"%lf",&temp);
    yylval.double_value = http://www.mamicode.com/temp;
    return DOUBLE_LITERAL;/*返回double标志*/
}
.    {
    printf("Lex Error");
    exit(1);
}

然后是解释器:

解释器负责处理返回的记号:

直接看代码不解释:

%{
#include <stdio.h>
#include <stdlib.h>
%}
%union{
    double    double_value;
}
%token ADD SUB MUL DIV CR
%token <double_value>DOUBLE_LITERAL
%type <double_value>primary_expression term expression
%%
program
    :expression CR{
        printf(">>%lf",$1);/*遇到换行符就输出结果*/
        exit(0);    /*退出*/
    }
    ;
expression
    :term
    |expression ADD term{
        $$ = $1 + $3;
    }
    |expression SUB term{
        $$ = $1 - $3;
    }
    ;
term
    :primary_expression
    |term MUL primary_expression{
        $$ = $1 * $3;
    }
    |term DIV primary_expression{
        $$ = $1 / $3;
    }
    ;
primary_expression
    :DOUBLE_LITERAL
    ;
%%
int yyerror(char const* str){
    printf("Error!\n");
    return 0;
}

int main(){
    FILE *yyin;
    yyin = stdin;
    yyparse();
}

大概就是这样~OK 结束~