编译原理实践11—语法分析程序的自动生成工具YACC
更新时间:2023-06-06 12:54:01 阅读量: 实用文档 文档下载
- 编译原理 语法分析推荐度:
- 相关推荐
编译原理实践 --语法分析程序的自动生成工具YACC
YACC简单的介绍 YACC(Yet Another CompilerCompiler) 是美国贝尔实验室开发的 语法分析程序自动生成器 输入是某个语言的语法规则,输出是 该语言的语法分析器。 目前YACC生 成的是一个LALR(1)分析器 常用版本:Berkeley大学的BYACC, GNU工程的BISON
YACC的使用流程YACC源程序Y_tab.c (宏定义文件) 字符串源程序
YACCC编译器 Y_tab.exe
Y_tab.c (宏定义文件) Y_tab.exe 分析结果
YACC的输入文件称为YACC源文件,以.y为扩展名,输出文 件有两个,一个是包含有语法分析函数yyparse()的C程序, 另一个是包含源文件中所有终结符编码的宏定义文件,扩展 名为.h。这两个文件经过C编译器的编译就生成一个语法分析 器,该语法分析器的输入是源程序经过词法分析的结果,输 出可以是一棵语法树,或者是所生成的目标代码,也可以是 关于输入串是否符合语法规则的信息。具体的输出形式可以 在YACC源程序中自己定义。
YACC和LEX有直接的接口,由于YACC与LEX 的特殊功能,这两个姐妹程序成为软件工程的重 要工具,被称为“黄金组合”。
很多程序设计语言编译程序的设计都使用了 LEX和YACC,比如著名的GNU C语言编译器, PASCAL语言向C语言的转换工具p2c等,就是 用FLEX和BISON实现的 多数程序设计语言的语法分析都采用LALR(1) 分析法,YACC也正是以LALR(1)文法为基础。 它通过对输入的形式文法规则进行分析,产生 LALR(1)分析表,输出以该分析表驱动的语法分 析器C语言源程序。
YACC源程序结构YACC源程序由三个部分组成,各部分以 “%%”为分隔符。说明部分和程序部分可 选,规则部分是必需的。 [说明部分] %% 规则部分 [%% 程序部分]
YACC源程序结构—说明部分 YACC源程序说明部分定义语法规则中要用 的终结符号,语义动作中使用的数据类型、 变量、语义值的联合类型以及语法规则中运 算符的优先级等。说明部分可以是空的。 说明部分通常包含两部分内容: C语言代码部分 Yacc说明部分
%{
YACC源程序结构—说明部分
头文件表宏定义 数据类型定义 全局变量定义 %}
文法开始符号定义语义值类型定义 终结符定义 非终结符定义 优先级和结合性定义
1-头文件表 yacc直接把这部分定义抄到所生成的C语言程 序y.tab.c去的,所以要按C语言的语法规定来 写。头文件表是一系列C语言的#include语句, 要从每行的第一列开始写,例如: %{ #include <stdio.h> #include <math.h> #include <ctype.h> #include “header.h” %} … %}
2-宏定义
这部分用C语言的 #define语句定义程序 中要用的宏
例如%{ … #define max(x,y)((x>y)?x:y) … %}
3-数据类型定义
这部分定义语义动作中或程序段部分中要用到 的数据类型 例如 %{ … typedef struct interval{ double lo,hi; }INTERVAL; … %}
4-全局变量定义 ... 外部变量(external variable)和yacc源程序中要用 到的全局变量都在这部分定义 例如 %{
extern int nfg;douhle dreg[ 26]; INTERVAL Vreg[26]; ... %}
5-语法开始符定义
上下文无关文法的开始符号是一个特殊的 非终结符,所有的推导都从这个非终结符 开始 在yacc中,语法开始符定义语句是 % start 非终结符…… 如果没有上面的说明,yacc自动将语法 规则部分中第一条语法规则左部的非终结 符作为语法开始符
6-语义值类型定义
yycc生成的语法分析程序yyparse用的 是LR分析方法,它在作语法分析时除了 有一个状态栈外,还有一个语义值栈 语义值栈存放它所分析到的非终结符和终 结符的语义值,这些语义值有的是从词法 分析程序传回的,有的是在语义动作中赋 与的
如果没有对语义值的类型做定义,那么 yacc认为它是整型(int)的,即所有语 法符号如果赋与了语义值,则必须是整型 的,否则会出类型错
6-语义值类型定义 但是用户经常会希望语义值的类型比较复杂, 如双精度浮点数,字符串或树结点的指针 这时就可以用语义值类型定义进行说明。因为 不同的语法符号的语义值类型可能不同,所以 语义值类型说明就是将语义值的类型定义为一 个联合(Union),这个联合包括所有可能用 到的类型(各自对应一个成员名) 为了使用户不必在存取语义值时每次都指出成 员名,在语义值类型定义部分还要求用户说明 每一个语法符号(终结符和非终结符)的语义 值是哪一个联合成员类型
6-语义值类型定义 例:% union{ int ival double dval INTERVAL vval; }
引用时候的方式%token <ival> DREG VREG %token <dval> CONST %type <dval>dexp %type <vval>vexp
以%token开始的行定义的是终结符的类型 以%type开始的行定义是非终结符的类型
7-终结符定义
在yacc源程序语法规则部分出现的所有 终结符(正文字符“+”,“-”等除外) 等必须用%token定义,定义形式: 单一数据类型: %token 终结符1 终结符2 多数据类型: %token <类型> 终结符1 终结符2 …
8-终结符定义
优先级和结合性定义 %left 左结合 %right 右结合 %nonassoc 无结合性 %prec <终结符> 强制定义优先级
YACC源程序—语法规则部分 语法规则部分是整个YACC源程序的主体,它是由一组 产生式及相应的语义动作组成。 规则部分包括修改的BNF格式的文法规则,以及将在识 别出识别出相关的文法规则时被执行的C代码中的动作 (即根据LALR(1)分析算法,在归约中使用
)。 文法规则中使用的元符号惯例如下: 通常,竖线|被用作替换(也可以分别写出替换项),而 用来分隔文法规则的左右两边的箭头符号-〉在YACC中 用冒号表示,最后,必须用分号来结束每个文法规则。
YACC源程序—语法规则部分对文法中的产生式 A:
A 1 | 2 | …| m
在YACC程序中可表示成
| 2……
1
{语义动作1} {语义动作2} {语义动作m}
| m;
YACC源程序—语法规则部分 YACC中的动作是由在每个文法规则中将其写作真正的C 代码(在大括号中)来实现的。 在书写动作时,可以使用YACC伪变量。当识别一个文 法规则时,规则中的每个符号都拥有一个值,除非它被 参数改变了。
这些值由YACC保存在一个与分析栈保持平行的值栈 (value stack)中,每个在栈中的符号值都可以使用以 $开始的伪变量来引用。 $$代表刚才被识别出来的非终结符的值,也就是文法规 则左边的符号。伪变量$1、$2、$3等代表了文法规则右 边的每个连续的符号。
YACC源程序—语法规则部分 例:文法规则和动作:
exp:exp’+’term{$$=$1+$3;}含义是:当识别规则exp-〉exp+term时, 左边exp值为右边的exp的值与右边的term 的值之和,其中$$代表规则左部符号exp的 值,$1代表规则右部第一个符号exp的值、 $3表示规则右部第三个符号term的值。
正在阅读:
编译原理实践11—语法分析程序的自动生成工具YACC06-06
措勤县职称论文发表-夹抱机控制程序改进论文选地的题目地的题目12-16
嘉兴市委党校引进人才待遇07-11
宫血宁减少药物流产后阴道出血的临床观察07-28
卷扬提升机械安全检查表07-19
技师职业资格申请表(安徽省)06-01
北邮 web技术 阶段作业10-04
一人公司章程(不设董事会不设监事会)09-03
西方建筑史作业 - 图文03-11
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 自动生成
- 编译
- 语法
- 原理
- 实践
- 工具
- 程序
- 分析
- YACC
- 凯程集训营房jingge学员考研经验分享
- 建设系统开展访民情解民忧保民生服务年活动实施方案
- 船舶高级消防课程中综合演练的人员编制和任务安排
- 2015年六安市公务员考试入围面试人员笔试成绩、面试成绩、总成绩
- 新概念3课后习题答案
- 风力机专用翼型发展现状及其关键气动问题分析
- 2014五年级(上)计算题练习
- 【后盾网PHP】向军老师基于织梦的土特产网实战二次开发VIP教程
- 第13章vb ActiveX控件
- 2011年全国各省市中考数学真题分类汇编_锐角三角函数(含答案)(1)
- 用I—DEAS软件进行结构几何非线性有限元分析
- 高中数学教案:3.2.1《古典概型》(1)(新课标人教A版必修三)
- 本试卷满分100分 考试时间120分钟
- 越想敲的门,叩的声越轻
- 化学与生活知识点
- 人参皂苷药理作用研究进展_何道同
- 中考必须掌握的生字
- 巴彦淖尔市产业化驰名商标、著名商标、知名商标名录(2013年)
- 第8章 空间数据库设计2
- 消防中介服务现状及发展趋势分析