Flex-Bison 示例项目教程

Flex-Bison 示例项目教程

flex-bison-exampleA simple example demonstrating a calculator written with flex/bison项目地址:https://gitcode.com/gh_mirrors/fl/flex-bison-example

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.lcalc.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();
}

这两个文件定义了如何解析输入的数学表达式,并生成相应的计算结果。

flex-bison-exampleA simple example demonstrating a calculator written with flex/bison项目地址:https://gitcode.com/gh_mirrors/fl/flex-bison-example

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛易曙Linda

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值