您的位置:首页 > 其它

编译原理学习一:flex,bsion工具使用

2016-07-05 12:25 357 查看
先尝试用它来做一个计算器(内容来自于自制编程语言——前桥和弥)

一、准备工作

关于flex, bsion工具,建议还是linux平台安装使用比较方便,我在windows下尝试过,太麻烦。

在ubuntu下安装很简单,只要执行下列语句即可:

sudo apt-get install flex bison
flex -h
bison -h


没有报错就说明安装成功。

二、词法分析部分

创建mycalc.l

%{
#include <stdio.h>
#include "y.tab.h"

int
yywrap(void)
{
return 1;
}
%}
%%
"+"    return ADD;
"-"    return SUB;
"*"    return MUL;
"/"    return DIV;
"\n"    return CR;
([1-9][0-9]*)|0|([0-9]+\.[0-9]+) {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.double_value = temp;
return DOUBLE_LITERAL;
}
[ \t]
. {
fprintf(stderr, "lexical error.\n");
exit(1);
}
%%


三、语法分析部分

创建mycalc.y

%{
#include <stdio.h>
#include <stdlib.h>
#define YYDEBUG 1
%}
%union {
int int_value;
double double_value;
}
%token <double_value> DOUBLE_LITERAL
%token ADD SUB MUL DIV CR
%type <double_value> expression term primary_expression
%%
line_list
: line
| line_list line
;
line
: expression CR
{
printf(">>%lf\n", $1);
}
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)
{
extern char *yytext;
fprintf(stderr, "parser error near %s\n", yytext);
return 0;
}

int main(void)
{
extern int yyparse(void);
extern FILE *yyin;

yyin = stdin;
if(yyparse()) {
fprintf(stderr, "Error ! Error ! Error !\n");
exit(1);
}
}


四、生成执行文件

bison --yacc -dv mycalc.y
flex mycalc.y
gcc -o mycalc y.tab.c lex.yy.c


执行上述语句后,可以在目录中看到mycalc程序。

五、测试

./mycalc
1+3*5
>>16
q
lexical error.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: