基础
参考链接: 【编译原理】用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 sectionline : 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可执行文件

