基础
参考链接: 【编译原理】用Yacc做语法分析 yacc / lex 在linux 下 使用指南
下载
要求
实现
注意当yacc使用自定义lex文件时,需要在lex开始include自定义yacc生成的头文件
lex
%{
//include自定义yacc生成的头文件
#include "bool.tab.h"
#include <stdio.h>
#include <stdlib.h>
%}
%%
true {yylval=1; return TRUE;}
false {yylval=0; return FALSE;}
.|\n {return yytext[0];}
%%
yacc文件
%{
#include <stdio.h>
#include <string.h>
void yyerror(){
printf("over, place run again\n");
}
%}
// declaration section
%{
#ifndef YYSTYPE
#define YYSTYPE int
#endif
%}
%token TRUE
%token FALSE
%%
// translation section
line : bexpr '\n' { if ($1==1){printf("true");}else{printf("false");}}
| '\n'
;
bexpr : bexpr '&' bterm { if(($1==1)&&($3==1)){$$=1;}else{$$=0;} }
| bterm
;
bterm : bterm '|' bfactor {if(($1==0)&&($3==0)){$$=0;}else{$$=1;}}
| bfactor
;
bfactor :'~' bfactor {if($2==1){$$=0;}else{$$=1;}}
| '('bexpr')' {$$=$2;}
| TRUE
| FALSE
;
%%
int main(void){
return yyparse();
}
编译
flex lex.l
生成lex.yy.c文件bison -v bool.y
生成bool.tab.c文件,改后缀为.h(-v可生成out文件,记录规约表)gcc lex.yy.c bool.tab.h -o exe -ll
生成exe可执行文件