Bison是一个语法分析器,bison和flex配合使用

可以将用户提供的语法规则转化成一个语法分析器

利用Bison,可以开发各种语言解释器

Bison的输入文件以.y作为后缀名

其语法文件的一般格式如下:

%{

Prologue

%}

Bison declarations

%%

Grammar rules

%%

Epilogue

使用两个%%分隔符,将文件分为三个部分

Prologue定义动作中使用的类型和变量

Bison Declaration声明了终结符号和非终结符号的名称

还可以描述运算符的优先级以及各种符号的语义值的数据类型

Grammar rules定义了如何从各个部分构造每个非终结符

Epilogue可以包含要使用的任何代码

直接下载,点击安装即可

全都安装好以后还要设置一下环境变量Path,即需要将Bison的安装目录添加到Path中

打开右键->我的电脑→属性→高级系统设置->环境变量->系统变量->Path->编辑->新建->输入Bison的安装目录具体到bin目录下->确定

退出后,打开CMD,输入bison - V,记住这里的v要大写。若安装成功就会显示bison的相关信息

C:\>bison -V

bison (GNU Bison) 2.4.1

Written by Robert Corbett and Richard Stallman.

Copyright (C) 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

然后结合具体的例子——四则运算来看看bison的作用

首先,准备好flex的词法文件cal.l:

另:flex的安装请见https://www.cnblogs.com/ASE265/p/12337922.html

%{

# include "y.tab.h"

%}

%%

[0-9]+ {yylval = atoi(yytext);return T_NUM;}

[-/+*()^\n] {return yytext[0];}

[ \t\r\a]+ {/*ignore all space*/}

. {return 0;}

%%

int yywrap(void){

return 1;

}

然后是bison的语法分析文件cal.y文件

%{

#include

int yylex();

void yyerror(const char* msg){}

%}

%token T_NUM

%left '+' '-'

%left '*' '/'

%%

S : S E '\n' {printf("ans=%d\n",$2);}

| /*enpty*/ {/*enpty*/}

;

E : E '+' E {$$ = $1+$3;}

| E '-' E {$$ = $1-$3;}

| E '*' E {$$ = $1*$3;}

| E '/' E {$$ = $1/$3;}

| T_NUM {$$ = $1;}

| '(' E ')' {$$ = $2;}

;

%%

int main(){

return yyparse();

}

然后,就是执行过程

首先bison -dyv cal.y

得到y.output,y.tab.c和y.tab.h这三个文件

然后执行词法分析文件

flex cal.l

得到lex.yy.c文件

最后对c文件进行编译

gcc lex.yy.c y.tab.c -o cal

得到可执行文件cal.exe

cal.exe就是我们的小型四则运算的编译器

测试结果如下

D:\>cal.exe

2+3

ans=5

5*9

ans=45

1-5*7

ans=-34

4+(6-9)

ans=1

确实,相当于实现了一个小型的四则运算的编译器

java下bison_windows下bison的安装与入门相关推荐

  1. java在mac下开发环境_Java开发环境安装(MacOS、Windows)

    目录 Java for Windows安装步骤 下载JDK 2.进入主页面之后点击 3.进入到JDK10下载页面之后,将页面下拉到最下方,找到Java Archive 4.即跳转到所有的Java版本中 ...

  2. linux java tar 卸载_linux下jdk的卸载与安装

    JDK的卸载 1.检查jdk的是否安装,显示如下表示安装: [root@localhost ~]# rpm -aq|grep java tzdata-java-2010l-1.el6.noarch j ...

  3. java gnu_GNU/Linux下Java开发环境的安装和配置 | 学步园

    首先下载JDK,在http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新版本的JDK,选择平台为linux,就会得 ...

  4. [java]——window64位下java的安装与配置

    前言 为生活所迫而学java 下载JDK JAVA DEVELOPMENT KIT(JDK) = JAVA RUNTIME ENVIRONMENT(JRE) + JAVA工具+JAVA基础库类.--热 ...

  5. linux 下jdk的卸载与安装

    2019独角兽企业重金招聘Python工程师标准>>> 1.查看Linux自带的JDK是否已安装 # java -version 2.查看JDK信息 # rpm -qa | grep ...

  6. Ubuntu下eclipse indigo版在线安装struts插件

    Ubuntu下eclipse indigo版在线安装struts插件: 1.打开eclipse,进入Help->Install new software...: 2.添加新站点,命名为:mvc, ...

  7. LINUX下tar.gz包的安装方法

    LINUX下tar.gz包的安装方法 在tar.gz的东西不多了---- ======================================== 大多以tar.gz 和tar.bz2打包软件 ...

  8. linux服务器安装php7_CentOS 7 下 PHP 7.1.12 安装配置

    Linux系统:CentOS 7 记录在CentOS 7 下 PHP 7.1.12 安装配置的过程. 先安装相关依赖包 yum install pcre pcre-devel zlib zlib-de ...

  9. Linux下JDK、Tomcat的安装及配置

    1.jdk的安装 1.1下载jdk 先查看Linux系统是多少位(32位/64位):getconf  LONG_BIT.再从JDK官网(http://www.oracle.com/technetwor ...

最新文章

  1. 个人建议:设置Alt+S快捷键来控制VSCode自动保存切换功能
  2. jQuery方法大全
  3. 连接数据库时常用的工具类(一)-------C3P0XmlUtils
  4. AL2018届校招笔试——自然语言处理
  5. QT的QModbusRequest类的使用
  6. dbscan聚类算法matlab_密度聚类DBSCAN、HDBSCAN(转)
  7. 基于 CNN 的中文对话情感分析
  8. 脚本编辑$RANDOM 和 case语句 (笔记)
  9. 华为正式宣布全场景AI计算框架MindSpore开源 降低AI开发门槛
  10. android的四大组件及使用场景,Android/四大组件/Activity.md · BoraxZYF/AndroidInterview - Gitee.com...
  11. 存储过程系列之存储过程返回值总结
  12. 普通人学python有啥用-普通人为什么要学习Python
  13. [题解] [AHOI2009] 跳棋
  14. 一个奇怪的发现:html与body,body的margin对html不起作用,html的padding对body却起作用
  15. 早先离开这个公司的人,都比吾聪明
  16. 学习了pr后的收获_PR学习感悟
  17. 如何抓取安卓APP日志?
  18. .NET Interop 互操作 COM+
  19. mstsc远程桌面连接失败,提示CredSSP加密Oracel修正
  20. 3ds max7渲染传奇三剑客VRay教程(PDF)

热门文章

  1. PS合成不会做阴影?自学 Photoshop 2022 Mac版,悬空?一眼假?这招屡试不爽
  2. [Xcode 实际操作]九、实用进阶-(24)使用Segue(页面的跳转连接)进行页面跳转并传递参数...
  3. 有了这7个高质量的黑科技软件,工作效率翻倍!
  4. 数学建模专栏 | 第二篇 :MATLAB 数学建模快速入门
  5. 激情世界杯,盛夏大放价,CDR 618返场继续嗨
  6. RK3568-ANDROID11-BOARD_HAVE_DONGLE 报错(3G/4G)
  7. Php生成货运交接单excel表,php 订单导出到excel表格及乱码问题
  8. python简介、第一个python程序、变量、字符编码、用户交互程序、if...else、while、for...
  9. Intel® 64 位和 IA-32 架构开发手册说明三卷中文版
  10. svchost.exe是什么进程,svchost.exe是病毒吗?