首页 > 代码库 > 【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 结束~