最近在学习编译原理,利用flex和bison编写一个基于文本识别的简单计算器程序,参考《flex于bison》中内容,对程序进行一些简单的修改,加入Makefile。该计算器程序主要实现识别文本中的整数和运算符,进行加减乘除四则运算,暂不考虑括号对运算顺序的影响。
flex用于词法分析器的构建,bison用于语法分析器构建,两者可以结合使用,利用bison生成源程序可以直接调用flex生成源程序中yylex()函数,提取标准输入文本中的目标字符,虽然main函数可以放到flex或bison的源码文件的用户自定义部分,但是不便于阅读和理解。因此将main函数单独放到一个cpp文件中,调用bison源码文件中的yyparse()函数对输入内容进行解析和处理。将计算器的运算实现放到bison源码的规则部分。
创建test.l文件,编写词法分析规则(数字和符号识别)
%{
#include <stdio.h>
#include "test_yacc.h"
//因为使用了bison在test_yacc.h中自动生成的token枚举
extern int yylval;
//yylval定义在bison库中
%}
number [0-9]
%%
{number}+ {
yylval = atoi(yytext);
printf("number: %d ", yylval);
return INT;
}
"+" {
printf("operator: + ");
return ADD;
}
"-" {
printf("operator: - ");
retur