编译原理实践 13.语法分析程序的自动生成工具YACC.

Slides:



Advertisements
Similar presentations
任课老师:戴新宇 助教: 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 2014年3月20日.
Advertisements

编译原理上机实习
面向对象程序设计 C#.Net 01 C#概述和简单编程 郑捷
Oracle数据库 Oracle 子程序.
第14章 c++中的代码重用.
C语言实验 第一课 标题:学号+姓名.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
在PHP和MYSQL中实现完美的中文显示
计算机基础知识 丁家营镇九年制学校 徐中先.
Using C++ The Weird Way Something about c++11 & OOP tricks
编译原理与技术 --文法和分析 2018/9/17 《编译原理与技术》讲义.
Introduction to Lex 電資三 B 盧逸峮
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
助教:胡光能,解定宝 编译原理讲师:戴新宇
管理信息结构SMI.
SQL Injection.
走进编程 程序的顺序结构(二).
辅导课程六.
词法&语法解析.
程序设计基础.
SPARQL若干问题的解释 刘颖颖
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第二章 Java语言基础.
整合思维导图的初中英语教学设计 主讲人:卢璐.
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
第3,4次课 一个简单的语法制导翻译器 2.3~2.5.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
程序设计工具实习 Software Program Tool
SOA – Experiment 2: Query Classification Web Service
一个RDF数据自然语言生成器的设计与实现
第一章 函数与极限.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
$9 泛型基础.
编译原理总结-1 第3~5章.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
自底向上的语法分析 4.5.
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
项目二:HTML语言基础.
本节内容 Win32 API中的宽字符 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
信号量(Semaphore).
第4章 Excel电子表格制作软件 4.4 函数(一).
第九节 赋值运算符和赋值表达式.
iSIGHT 基本培训 使用 Excel的栅栏问题
3.16 枚举算法及其程序实现 ——数组的作用.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
魏新宇 MATLAB/Simulink 与控制系统仿真 魏新宇
Python 环境搭建 基于Anaconda和VSCode.
本节内容 结构体.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
基本知识 数据类型、变量、常量、运算符.
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
编译原理实践 6.程序设计语言PL/0.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

编译原理实践 13.语法分析程序的自动生成工具YACC

Yacc简介 YACC(Yet Another Compiler-Compiler) 是美 国贝尔实验室开发的语法分析程序自动生成器 输入是某个语言的语法规则,输出是该语言的语法 分析器 目前YACC生成的是一个LALR(1)分析器 常用版本:Berkeley大学的BYACC, GNU工程的 BISON

Yacc使用流程(1) YACC的输入文件称为YACC源文件,以.y为扩展 名 输出文件有两个 一个是包含有语法分析函数yyparse()的C程序 另一个是包含源文件中所有终结符编码的宏定义文件, 扩展名为.h。 这两个输出文件经过C编译器的编译就生成一个语 法分析器,该语法分析器的输入是源程序经过词法 分析的结果,输出可以是一棵语法树,或者是所生 成的目标代码,也可以是关于输入串是否符合语法 规则的信息。具体的输出形式可以在YACC源程序 中自己定义。

YACC的使用流程(2) YACC源程序 YACC Y_tab.c (宏定义文件) C编译器 Y_tab.exe 字符串源程序 分析结果

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-语义值类型定义 yacc生成的语法分析程序yyparse用的是LR分析方法,它在作语法分析时除了有一个状态栈外,还有一个语义值栈 语义值栈存放它所分析到的非终结符和终结符的语义值,这些语义值有的是从词法分析程序传回的,有的是在语义动作中赋与的 如果没有对语义值的类型做定义,那么 yacc认为它是整型(int)的,即所有语法符号如果赋与了语义值,则必须是整型的,否则会出类型错

但是用户经常会希望语义值的类型比较复杂,如双精度浮点数,字符串或树结点的指针 这时就可以用语义值类型定义进行说明。因为不同的语法符号的语义值类型可能不同,所以语义值类型说明就是将语义值的类型定义为一个联合(Union),这个联合包括所有可能用到的类型(各自对应一个成员名) 为了使用户不必在存取语义值时每次都指出成员名,在语义值类型定义部分还要求用户说明每一个语法符号(终结符和非终结符)的语义值是哪一个联合成员类型

以%token开始的行定义的是终结符的类型 以%type开始的行定义是非终结符的类型 例: % 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源程序—语法规则部分 对文法中的产生式 在YACC程序中可表示成 A: {语义动作1} {语义动作2} …… {语义动作m} ;

YACC源程序—语法规则部分 YACC中的动作是由在每个文法规则中将其写作真正的C代码(在大括号中)来实现的。 这些值由YACC保存在一个与分析栈保持平行的值栈(value stack)中,每个在栈中的符号值都可以使用以$开始的伪变量来引用。 $$代表刚才被识别出来的非终结符的值,也就是文法规则左边的符号。伪变量$1、$2、$3等代表了文法规则右边的每个连续的符号。

YACC源程序—语法规则部分 例:文法规则和动作: exp:exp’+’term{$$=$1+$3;} 含义是:当识别规则exp->exp+term时,左边exp值为右边的exp的值与右边的term的值之和,其中$$代表规则左部符号exp的值,$1代表规则右部第一个符号exp的值、$3表示规则右部第三个符号term的值。

YACC源程序—程序部分组成 YACC源程序的程序部分包括: 主程序 main() 错误信息执行程序 yyerror(s) 词法分析程序yylex(),可以与LEX进行整合 用户在语义动作中用到的子程序 YACC约定 传递词法分析程序token属性值的全程变量名:yylval 生成的语法分析程序名为:yyparse();

二义性文法的处理 YACC生成LALR(1)分析器,如果接受的文法不是LALR(1)分析表就有冲突 YACC解决冲突的默认规则为: 移进—归约冲突:移进动作优先于归约动作。