第5章 本讲要点 YACC
第5章 本讲要点 ◼ YACC
5.5Yacc:一个LALR(1)分析程序的生成器 Yacc代表 Yet Another Compiler Compiler 由 S C Johnson等人在AT&T贝尔实验室研制开 发的,早期作为UNIX操作系统中的一个实用程序, 现在Yacc得到广泛使用。 YaCC有多个版本, Bison是它的一个常用版本
5.5 Yacc:一个LALR(1)分析程序的生成器 ◼ Yacc 代表 Yet Another Compiler Compiler。 ◼ 由S.C.Johnson等人在AT&T贝尔实验室研制开 发的,早期作为UNIX操作系统中的一个实用程序, 现在Yacc得到广泛使用。 ◼ Yacc有多个版本,Bison是它的一个常用版本
Yacc的使用 Yacc程序将任何一种编程语言的所有语法说 明文件(Y)翻译成针对此种语言的Yacc语法解 析器。 L语言的YacC说明文 件(Y) L语言语法分析器 YaCC程序 输入串 语法树 L语言语法分析器
L语言语法分析器 Yacc程序 Yacc的使用 Yacc 程序将任何一种编程语言的所有语法说 明文件(.Y)翻译成针对此种语言的 Yacc 语法解 析器。 L语言的Yacc说明文 件(.Y) L语言语法分析器 输入串 语法树
Yacc的使用 1.采用命令 yacc[选择项] filename.y 生成 y tab. c(或者 stab. c)的文件。 2.在c环境下将其编译成可执行文件
Yacc的使用 1. 采用命令 yacc [选择项] filename.y 生成y.tab.c(或者ytab.c)的文件。 2. 在C环境下将其编译成可执行文件
Yacc说明文件的结构 Yacc说明文件基本格式如下 definitions 3 定义部分 d rules y 规则部分 0%o auxiliary routines] 辅助程序部分
一、 Yacc说明文件的结构 Yacc说明文件基本格式如下: { definitions } 定义部分 %% { rules } 规则部分 %% {auxiliary routines} 辅助程序部分
口定义部分包括了Yacc分析程序的有关记号、 数据类型以及文法规则的信息。 口它还包括了必须直接进入输出文件的任何C代码, 如# include语句等) 注:定义部分可为空
❑定义部分包括了Yacc分析程序的有关记号、 数据类型以及文法规则的信息。 ❑它还包括了必须直接进入输出文件的任何C代码, 如#include语句等), 注:定义部分可为空
变量定义 变量定义需用一对%{和%包括起来,其内容包括有关文件 的 引用说明、数据结构的定义、全局和外部变量的定义等等, 应邀倆C语凉的规定。 # include≤ stdio. h> int count extern double valuei int function (int a, float bi
①变量定义 变量定义需用一对%{和%}包括起来,其内容包括有关文件 的 引用说明、数据结构的定义、全局和外部变量的定义等等, 应遵循例如:C语言的规定。 %{ #include … int count; extern double value; … int function(int a,float b); … %}
口规则部分包括BNF格式的文法规则以及在识别 出相应文法规则时要执行的动作 动作用C代码表示,当用该规则去归约时执行与 之对应的动作) 口Yacc中文法规则使用的元符号约定: 竖线用作替换 箭头符号→改成冒号: 每个文法规则末以分号结束。 口辅助程序部分包括了过程和函数声明(可空!)。 口Yac还允许将C-风格的注解插入到输入文件中
❑规则部分包括BNF格式的文法规则以及在识别 出相应文法规则时要执行的动作. 动作用C代码表示,当用该规则去归约时执行与 之对应的动作)。 ❑Yacc中文法规则使用的元符号约定: 竖线|用作替换。 箭头符号→改成冒号:, 每个文法规则末以分号结束。 ❑辅助程序部分包括了过程和函数声明(可空!)。 ❑Yacc还允许将C-风格的注解插入到输入文件中
编写yacc说明文件 Yacc识别记号的方法 1)文法规则的单引号中的任何字符都被识别为 它本身。如运算符记号“+)、-3和‘*’。 2)在%记号(% token)中声明符号记号,如 token NUMBER
编写yacc说明文件 Yacc识别记号的方法 1)文法规则的单引号中的任何字符都被识别为 它本身。如运算符记号‘+’ 、 ‘-’和‘*’ 。 2)在%记号(%token)中声明符号记号,如 %token NUMBER
编写yacc说明文件 Yacc对记号的处理 YaC为每个记号自动分配一个不与任何字符值冲突的 数字值,通常从258开始赋值 yac将这些定义作为# define语句插入到输出代码中 如:# define number258 用户也可指定将赋给记号的数字。 例:% token number18,就将给 NUMBER赋值18
编写yacc说明文件 Yacc对记号的处理 ◼Yacc为每个记号自动分配一个不与任何字符值冲突的 数字值,通常从258开始赋值。 yacc将这些定义作为#define语句插入到输出代码中。 如:#define NUMBER 258 ◼用户也可指定将赋给记号的数字。 例:%token NUMBER 18,就将给NUMBER赋值18