使用bison编写语法分析器

yacc基本语法

%{
	#include<stdio.h>
	#include<ctype.h>
	/*包含include*/
%}
/*在这里写终结符
如:
%token NUM
%left ADD
%left SUB
%right NOT
这里Token代表记号,left代表左结合,right代表右结合
*/
%%
/*这里写语法规则即是grammer*/
line:expr '\n'{
	printf("%d\n",$1);
};
expr:expr '+' term{
$$=$1+$3;
}|term{
	$$=$1;
};
term: term '*' factor{
	$$=$1*$3;
}| factor{
	$$=$1;
};
factor: '(' expr ')'{
	$$=$2;
}|NUM{$$=$1;};
DIGIT:'0'{$$=0;}|'1'{$$=1;}|'2'{$$=2;}|'3'{$$=3;}|'4'{$$=4;}|'5'{$$=5;}|'6'{$$=6;}|'7'{$$=7;}|'8'{$$=8;}|'9'{$$=9;}
POS_DIGIT:'1'{$$=1;}|'2'{$$=2;}|'3'{$$=3;}|'4'{$$=4;}|'5'{$$=5;}|'6'{$$=6;}|'7'{$$=7;}|'8'{$$=8;}|'9'{$$=9;}
NUM:DIGIT{
	$$=$1;
}|POS_DIGIT NUM{
	int len=1,tmp=$2;
	while(tmp){
		tmp/=10;
		len*=10;
	}
	$$=$1*len+$2;
}
%%
/*这里写一些函数*/
main(){
	return yyparse();
}
int yylex(void){
	return getchar();
}
void yyerror(char *s){
	printf("%s\n",s);
}

makefile

CFLAGS = -g -Wall -ansi -pedantic

minil: mini_l.lex final.y
	bison -d -v final.y
	flex mini_l.lex	
	gcc lex.yy.c final.tab.c -lfl -o minil1
	rm -f lex.yy.c

bison -d -v final.y代表使用.y文件生成c语言代码.
flex mini_l.lex表示编译lex文件。
gcc表示编译c语言文件为可执行文件。

后续继续添加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值