flex和bison的简单实现

flex的词法分析

    flex词法分析倒是没什么很复杂的,主要是正则表达式,然后就是一堆关键字,照抄然后动作为“return *”就行了,return的意思就是让语法分析可以直接使用此定义的词法,利用这些词法构造语法。

%{
	#include"3.tab.c"
	int lexerror(char *s);
%}

%%

"break" {printf("break   1\n");return BREAK;}
"case" {printf("case   2\n");return CASE;} 
"char" {printf("char   2\n");return CHAR;}
"continue" {printf("continue   1\n");return CONTINUE;}
"default" {printf("default   2\n");return DEFAULT;}
"do" {printf("do   1\n");return DO;}
"double" {printf("double   2\n");return DOUBLE;}
"else" {printf("else   2\n");return ELSE;}
"enum" {printf("enum   2\n");return ENUM;}
"float" {printf("float   2\n");return FLOAT;}
"for" {printf("for   1\n");return FOR;}
"if" {printf("if   1\n");return IF;}
"int" {printf("int   1\n");return INT;}
"long" {printf("long   2\n");return LONG;}
"return" {printf("return   1\n");return RETURN;}
"static" {printf("static   2\n");return STATIC;}
"struct" {printf("struct   2\n");return STRUCT;}
"switch" {printf("switch   2\n");return SWITCH;}
"typedef" {printf("typedef   2\n");return TYPEDEF;}
"union" {printf("union   2\n");return UNION;}
"void" {printf("void   2\n");return VOID;}
"while" {printf("while   1\n");return WHILE;}
"main" {printf("main   2\n");return MAIN;}

_?[a-zA-Z]+[0-9]* {printf("%s   2\n",yytext);return STR;}
[0-9]+ {printf("%d   3\n",atoi(yytext));yylval = atoi(yytext); return WINT;}
"+" {printf("+   4\n"); return ADD; }
"-" {printf("-   4\n"); return SUB; }
"*" {printf("*   4\n"); return MUL; }
"/" {printf("/   4\n"); return DIV; }
">" {printf(">   4\n"); return G;}
"<" {printf("<   4\n"); return LESS;}
">=" {printf(">=   4\n");return GE;}
"<=" {printf("<=   4\n");return LE;}
"!=" {printf("!=   4\n");return NQ;}
"=" {printf("=   4\n");return E;}

"{" {printf("{   5\n");return L;}
"}" {printf("}   5\n");return R;}
"," {printf(",   5\n");return D;}
";" {printf(";   5\n");return FH;}
"\"" {printf("\"   5\n");return Y;}
"(" {printf("(   5\n");return LP;}
")" {printf(")   5\n");return RP;}

\n      { return EOL; }
[ \t]   { /* ignore white space */ }

%%

int yywrap(void){
	return 1;// 只处理一个输入文件
}

    需要啥就定义什么呗。

    最后别忘了把bison产生的.c文件包含进来。

bison语法分析

    语法分析最重要的就是要写出正确的产生式,下面是一个普通函数的语法,如果函数不完整就会报错

%{
	#include<stdio.h>

	int yyerror(char *s);
	int yylex();
%}

%token IF INT FOR WHILE DO RETURN BREAK CONTINUE
%token MAIN STR AUTO CASE CHAR CONST DEFAULT DOUBLE ELSE ENUM EXTERN FLOAT GOTO INLINE LONG REGISTER SHORT SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED VOID VOLATILE
%token WINT
%token ADD SUB DIV MUL G LESS GE LE NQ E
%token D FH L R Y LP RP
%token EOL

%%

S : 
	| A LP RP EOL L EOL C R{printf("恭喜你成功解析");}
	| S EOL
	;
	
A :
	| J MAIN
	| J STR
	;
	
C : 
	| J STR I FH C
	| EOL C
	;

I :
	| D I 
	| E WINT
	| E STR K WINT
	;
	
J :
	| INT|FLOAT|DOUBLE|LONG
	;
	
K :
	| ADD
	| DIV
	| MUL
	| SUB
	| LESS
	| GE
	| LE
	| G 
	| NQ
	| E 
	;


%%

int main(){
	printf("请输入需要解析的:(main()之后请回车{后请回车)\n");
	FILE *f = fopen("。。\\代码\\1.txt","r");
	yyin=f;
	yyparse();
}

int yyerror(char *s)
{
  fprintf(stderr, "请输入完整且正确的函数: %s\n", s);
  yyparse();
}
最后,编译一下就可以运行了。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值