- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理实践--语法分析程序的自动生成工具YACC YACC简单的介绍 YACC(Yet Another Compiler-Compiler) 是美国贝尔实验室开发的语法分析程序自动生成器 输入是某个语言的语法规则,输出是该语言的语法分析器。 目前YACC生成的是一个LALR(1)分析器 常用版本:Berkeley大学的BYACC, GNU工程的BISON YACC的使用流程 YACC源程序 YACC Y_tab.c (宏定义文件) C编译器 Y_tab.exe 字符串源程序 Y_tab.exe 分析结果 YACC的输入文件称为YACC源文件,以.y为扩展名,输出文件有两个,一个是包含有语法分析函数yyparse()的C程序,另一个是包含源文件中所有终结符编码的宏定义文件,扩展名为.h。这两个文件经过C编译器的编译就生成一个语法分析器,该语法分析器的输入是源程序经过词法分析的结果,输出可以是一棵语法树,或者是所生成的目标代码,也可以是关于输入串是否符合语法规则的信息。具体的输出形式可以在YACC源程序中自己定义。 Y_tab.c (宏定义文件) 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),这个联合包括所有可能用到的类型(各自对应一个成员名) 为了使用户不必在存取语义值时每次都指出成员名,在语义值类型定义
原创力文档


文档评论(0)