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语言文件为可执行文件。