[Flex&Bison]协同工作简介

本文介绍如何使用Flex和Bison协同工作,创建一个简单的模拟BC计算器程序,解析整数的四则运算。Bison通过BNF范式定义上下文无关文法,构造语法树,而Flex负责标记解析。程序中详细阐述了Bison的规则段、产生式规则和优先级设置,以及Flex的作用。最终展示运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 本节主要演示一个简单的模拟bc计算器的程序,主要功能就是解析整型数的四则运算,先给出bison程序:

%{

#include <stdlib.h>
#include <stdio.h>

%}

/* 定义两个记号,D_INT表示整型类型,EOL表示换行(End Of Line) */
%token	D_INT
%token	EOL

/* 以下4组BNF范式来定义构造语法树的规则 */
/* 每条规则都有一个对应的C语言动作,表示一旦bison使用该规则去构造语法树(的一部分),则执行相应的动作 */

%%

/* 由于这是第一组规则,因此cac将作为语法起始符号,cac:的第一行用空规则表示 */
cac : /* cac -> cac exp EOL */
	/* |表示从左边的cac推到到右边的表达式有多种不同的方式,即或的意思 */
	/* :可以理解为推导符号-> */
	/* :的左边为目标符号,其值用$$表示 */
	/* :右边的语法符号的值从左到右依次为$1、$2、$3…… */
	| cac exp EOL { printf( "ans = %d\n", $2 ); }
	; /* ;表示一组规则的结束,同时也作为行分隔符美观代码 */

exp : fac /* exp -> fac|exp+fac|exp-fac */
	/* 虽然exp -> fac的这条规则没有定义动作,但是bison会默认处理成$$ = $1 */
	/* 这非常符合常理 */
	| exp '+' fac { $$ = $1 + $3; }
	| exp '-' fac { $$ = $1 - $3; }
	;

fac : trm /* fac -> trm|fac*trm|fac/trm *
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值