Flex-Bison 示例项目教程
1. 项目的目录结构及介绍
flex-bison-example/
├── Makefile
├── README.md
├── calc.l
├── calc.y
├── calc.h
├── calc.c
└── main.c
- Makefile: 用于编译项目的Makefile文件。
- README.md: 项目说明文档。
- calc.l: Flex词法分析器定义文件。
- calc.y: Bison语法分析器定义文件。
- calc.h: 项目头文件,包含公共定义和声明。
- calc.c: 与Bison生成的代码一起使用的C文件。
- main.c: 主程序文件,包含程序的入口点。
2. 项目的启动文件介绍
main.c 是项目的启动文件,包含程序的入口点 main
函数。该文件负责初始化和调用词法分析器和语法分析器,处理输入并输出结果。
#include "calc.h"
int main(int argc, char **argv) {
++argv, --argc; /* skip over program name */
if (argc > 0)
yyin = fopen(argv[0], "r");
else
yyin = stdin;
yyparse();
}
3. 项目的配置文件介绍
calc.l 和 calc.y 是项目的配置文件,分别定义了词法分析器和语法分析器的行为。
calc.l
%{
#include "calc.h"
#include "calc.tab.h"
%}
%%
[ \t]+ /* skip whitespace */
\n { return EOL; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
%%
int yywrap() {
return 1;
}
calc.y
%{
#include <stdio.h>
#include "calc.h"
%}
%token NUMBER
%token ADD SUB MUL DIV EOL
%%
input:
| input line
;
line:
EOL
| exp EOL { printf("Result = %d\n", $1); }
;
exp:
NUMBER
| exp ADD exp { $$ = $1 + $3; }
| exp SUB exp { $$ = $1 - $3; }
| exp MUL exp { $$ = $1 * $3; }
| exp DIV exp { $$ = $1 / $3; }
;
%%
int main(int argc, char **argv) {
++argv, --argc; /* skip over program name */
if (argc > 0)
yyin = fopen(argv[0], "r");
else
yyin = stdin;
yyparse();
}
这两个文件定义了如何解析输入的数学表达式,并生成相应的计算结果。