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();
}
最后,编译一下就可以运行了。