- 浏览: 263720 次
- 性别:
- 来自: 济南
文章分类
最新评论
08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活。此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xiaowei_cqu/article/details/7747205
语法分析
Yacc 全称 Yet Another Compiler Compiler
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
Yacc是一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
Yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
Yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
【实验内容】
1、实验环境配置
安装Parser Generator,并编译lex和yacc函数库
安装Parser Generator,并编译lex和yacc函数库
2、编写Lex程序
(1)练习9.4.1:编写一个Yacc程序。该程序以布尔表达式作为输入(如习题4.2.2所示)并输入次布尔表达式的值。
编写Yacc程序如下:
编写Yacc程序如下:
编写Lex程序如下:
布尔表达式对应的文法如下:
- bexpr→bexpr or bterm | bterm
- bterm→bterm and bfactor | bfactor
- bfactor→not bfactor |(bexpr) | true |false
所以程序中通过相应的语法定义规则:
line : bexpr '\n' {if($1==1){printf("true");}else{printf("false");}} | '\n' {printf("\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在读到1或0(通过Lex定义的语法返回的响应值)以及‘|’或‘&’‘~’布尔运算符号时,进行布尔预算,并返回值
根据布尔运算的结果打印“true”或“false”的消息
程序运行结果:
(2)练习9.4.2:编写一个yacc程序,把字符串(按4.2.2(5)语法定义,但使得可以输出任何一个字符元素,而不是仅仅字符a)作为输出,并输出相同顺序的字符串
4.2.2定义的规则(5)为:S→(L)|a L→L,S|S
在Yacc中只需定义相应的语法规则
在Yacc中只需定义相应的语法规则
line: L '\n' | '\n' ; L : S | L ',' S ; S :'(' L ')' {$$=$2;} | LETTER {printf("%c",$1);}并在遇到字符时,打印字符即可得到效果
编写Lex程序如下:
程序运行结果:
(3)练习9.4.3:编写一个Yacc程序。判断输入的字符串是否是回文(正读或逆读的结果相同)。
编写Lex程序如下:
程序通过Lex识别连续的字符串
之后通过C语言判断是否是回文:将第i个字符与第len-i-1个字符比较,如果有不相同的,则将标记tag标记为0(否则为1)
程序最后(读入换行符‘\n’时)通过tag标记输出是否为回文。
之后通过C语言判断是否是回文:将第i个字符与第len-i-1个字符比较,如果有不相同的,则将标记tag标记为0(否则为1)
程序最后(读入换行符‘\n’时)通过tag标记输出是否为回文。
程序运行结果:
【结果分析】
- 通过实验熟悉了Yacc做语法分析。尝试了Yacc程序两种编写方式,只有Yacc以及与Lex结合。感觉还是与Lex结合更灵活一些,因为Lex定义正则表达式作词法分析。比如字符串true。Lex只需写true{yylval=1;return TRUE;}而在Yacc中尝试判断写出来的语句为char c=getchar();int i=0;while(c=getchar()){if(c=='t')i=1;else if(c=='r'&&i==1)i=2;else if(c=='u'&&i==2)i=3;else if(c=='e'&&i==3)yylval=1;i=0;return TRUE;}(当然也可能是自己的思路复杂了些。。。)
- 实验中几个题目并不复杂,前两个更侧重语法判断,但第三个回文测试时,感觉并没用到太多Yacc的语法分析。而是通过Lex识别字符串,之后用C的思想判断是为回文。虽然也达到了效果,但不知是否还有其他的方法?
- 实验程序的容错能力都比较差,输入一些没有定义的字符程序就会弹出终止,调了很久也没有解决。感觉自己语法分析还是掌握的不够扎实。
转载请注明出处:http://blog.csdn.net/xiaowei_cqu/article/details/7764913
发表评论
-
unity基础开发----物体位移和旋转实用代码
2013-11-21 22:46 1221using UnityEngine; using Syst ... -
Android中View绘制优化之一---- 优化布局层次
2012-09-04 23:00 967... -
Android中View绘制优化二一---- 使用<include />标签复用布局文件
2012-09-08 13:54 971... -
Android中View绘制优化之三---- 优化View
2012-09-13 21:00 1044... -
兰林任务管理应用程序雏形版以及概要说明
2012-09-15 21:54 827... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(上)
2012-10-10 18:14 1065... -
Android中measure过程、WRAP_CONTENT详解以及xml布局文件解析流程浅析(下)
2012-10-17 20:05 808... -
Android中文件选择器的实现
2012-11-30 08:59 1077... -
【编译原理】使用Lex将C/C++文件输出为HTML文件
2012-07-20 09:37 97008年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【编译原理】正则表达式
2012-07-21 21:49 213208年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】访问Mat图像中每个像素的值
2012-07-22 07:10 1092今天百度搜资料还搜到了自己的。。。《访问图像中每个像素的值 ... -
【UML】UML几种图的绘制
2012-07-24 09:49 93808年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【OpenCV】邻域滤波:方框、高斯、中值、双边滤波
2012-07-26 10:52 1407邻域滤波(卷积) 邻域算子值利用给定像素 ... -
【数据结构】排序算法:希尔、归并、快速、堆排序
2012-07-28 06:15 93808年9月入学,12年7月毕 ... -
【OpenCV】角点检测:Harris角点及Shi-Tomasi角点检测
2012-07-31 13:25 1490角点 特征检测与匹配 ... -
【UML】案例分析:机场运作系统
2012-08-01 17:22 292108年9月入学,12年7月毕 ... -
【OpenCV】边缘检测:Sobel、拉普拉斯算子
2012-08-04 13:41 1467边缘 边缘(edge)是指图像局部强度变化最显著的部分。主要 ... -
【OpenCV】Canny 边缘检测
2012-08-08 10:17 1935Canny 边缘检测算法 1986 ... -
【UML】案例分析:新型超市购物自助系统
2012-08-19 01:13 125608年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ... -
【数据结构】二叉树、AVL树
2012-08-21 00:30 103708年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大 ...
相关推荐
编译原理实验,用yacc实现程序语言的语法分析器
来源于北邮编译原理作业,代码中的语法分析和语义分析均为基于yacc实现,文件中包括代码、文档、测试用例。可供yacc初学者学习参考。
编译原理实验四,用Flex&Bison;进行语法分析,有正确的.l和.y文件。(实验4 用Yacc工具构造语法分析器)
编译原理 词法分析器 语法分析器 yacc 编译原理 编译原理词法分析器语法分析器
C++语言的语法分析器,代码借助yacc和lex,实现了语法书的生成及展示
YACC Decaf 语法分析器 程序的执行方法是: (1)运行debug.bat; (2)用vc6.0打开pp2.dsw,编译链接生成pp2.exe; (3)运行pp2 [filename]。其中filename是可选部分,如果没有filename,就默认是打开test.frag,...
编译原理语法分析实验,C语言编写的PL0代码编译程序
语法分析程序的自动生成工具YACC相关知识介绍。
用Yacc编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。
C++_编译原理_语法分析 5.1 自下而上分析基本问题 5.2算符优先分析 5.3 LR 分析法 5.4 语法分析器的自动产生工具 YACC
北邮 编译原理与技术 课程实验 语法分析程序 用C++实现,包含递归下降分析,LL(1),LR(1),YACC的所有源代码及测试输入文件
编译原理课程实验二实验二 语法和语义分析器 一 实验目的 1、掌握Yacc的基本用法,并能够根据语言给出语法规则的定义,最后生成语言的解析器; 2、使用使用Yacc实现一个高级计算器程序; 二 实验内容 实现一个简单的...
yacc实现语法分析的y文件,实现一些常见表达式的编译可结合flex的l文件一起进行工作
华中科技大学 编译原理 面向过程的C语言的编译器设计 功能包括:词法分析和语法分析、语义分析、中间代码生成的 源码 题目:c--语言编译器设计与实现(请为自己的编译器命名) 源语言定义:或采用教材中Decaf语言,...
·parsegen:windows下的lex和yacc,支持c,cpp,java,使用方便,配置复杂,网上可以搜到详细介绍。 ·graphviz:根据脚本生成图像的软件,可以用来生成语法树。 ·Ex_2:第二个小练习,为SmallLan语法生成语法树注释...
编译原理 lex & yacc qq
实验分为两部分,第一部分是词法分析生成器Lex的构造,第二部分是语法分析生成器Yacc的构造。另外,根据自己开发的工具,生成C语言子集的词法分析器和语法分析器。
本资源来源于北邮编译原理作业,代码中的语法分析和语义分析均为基于yacc实现,文件中包括代码、文档、测试用例。可供yacc初学者学习参考。
利用语法分析器生成工具Yacc/Bison编写一个语法分析程序,与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。 有报告,有代码 输入:代码片断 输出:规约产生式
使用Lex及Yacc实现词法分析和语法分析;用C语言或者其他的高级语言作为宿主语言完成实验一设计的C0语言的词法分析器的设计和实现;用C语言或者其他的高级语言作为宿主语言完成C0语言语法分析程序的实现。