基础

参考链接: 【编译原理】用Yacc做语法分析 yacc / lex 在linux 下 使用指南

下载

sudo apt-get install bison

要求

给定下列文法,实现语法分析器
bison实现语法分析器 - 图1

实现

注意当yacc使用自定义lex文件时,需要在lex开始include自定义yacc生成的头文件

lex

  1. %{
  2. //include自定义yacc生成的头文件
  3. #include "bool.tab.h"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. %}
  7. %%
  8. true {yylval=1; return TRUE;}
  9. false {yylval=0; return FALSE;}
  10. .|\n {return yytext[0];}
  11. %%

yacc文件

  1. %{
  2. #include <stdio.h>
  3. #include <string.h>
  4. void yyerror(){
  5. printf("over, place run again\n");
  6. }
  7. %}
  8. // declaration section
  9. %{
  10. #ifndef YYSTYPE
  11. #define YYSTYPE int
  12. #endif
  13. %}
  14. %token TRUE
  15. %token FALSE
  16. %%
  17. // translation section
  18. line : bexpr '\n' { if ($1==1){printf("true");}else{printf("false");}}
  19. | '\n'
  20. ;
  21. bexpr : bexpr '&' bterm { if(($1==1)&&($3==1)){$$=1;}else{$$=0;} }
  22. | bterm
  23. ;
  24. bterm : bterm '|' bfactor {if(($1==0)&&($3==0)){$$=0;}else{$$=1;}}
  25. | bfactor
  26. ;
  27. bfactor :'~' bfactor {if($2==1){$$=0;}else{$$=1;}}
  28. | '('bexpr')' {$$=$2;}
  29. | TRUE
  30. | FALSE
  31. ;
  32. %%
  33. int main(void){
  34. return yyparse();
  35. }

编译

  • 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可执行文件

image.png