语法分析程序的设计与实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Lex first.l Yacc second.y cc-o yaccdemo y.tab.c lex.yy.c ◆yacc 原理介绍 Yacc 是用可移植的 C 语言写成的。接受的规定类别是非常一 般性的: 带有去歧义规则的 LALR(1) 文法。 Yacc 提供了一个通用工具来在计算机程序的输入上施加结构。 Yacc 用户准备输入处理的规定;它包括描述输入结构的规则,在识 别了这些规则的时候调用的代码,和做基本输入的一个低层例程。 Yacc 接 着 生 成 一 个 函数 来 控制 输入 处 理。 这 个函 数 叫做 解 析 器 (parser),它调用用户提供的低层输入例程(词法分析器(analyzer))来从 输入流中选取基本项目(叫做记号(token))。依据叫做文法规则的输入 结构规则来组织这些记号;在识别了这些规则中的某一个的时候,接 着调用为这个规则提供的叫做动作的用户代码;动作有能力返回值并 使用其他动作的值。 为了便利在动作和解析器之间的通信,对动作语句要做稍微的改 动。在这个上下文中使用美元符号“$”作为给 Yacc 的一个信号。
三:实验方法:
◆由 LEX 建立 YACC 的词法分析程序 由 LEX 产生的词法分析程序可用于 YACC,LEX 编译程序根据 LEX 源程序产生词法分析程序 yylex(),这个名字就是 YACC 所需要的词法 分析程序的名字。如果 YACC 要调用 LEX 产生的词法分析程序,则在 YACC 源程序的第三部分用语句#include“lex.yy.c”代替函数 yylex()
为这个名字或文字的记号编号。不通过这种机制定义的名字和文字保 持它们的缺省定义。所有记号编号都是不同的是很重要的。
构造词法分析器的一个有用的工具是 Mike Lesk[8]开发的 Lex 程序。这些词法分析器设计用来与 Yacc 解析器紧密协调工作。 这些词法分析器的规定使用正则表达式而不是文法规则。可以轻易的 用 Lex 生 成非 常 复杂 的词 法分 析器 , 但是 仍有 一些 语言 (比 如 FORTRAN)不适应任何理论框架,它的词法分析器必须手工制作。
◆由 LEX 建立 YACC 的词法分析程序....................................................................................................2 ◆yacc 原理介绍......................................................................................................................................3 ◆词法分析 .............................................................................................................................................. 4 ◆解析器如何工作 .................................................................................................................................. 5 ◆Yacc 环境..............................................................................................................................................5 ◆常用代码 .............................................................................................................................................. 7
◆词法分析 用户必须提供一个词法分析器来读取输入流并把记号(带有值, 如果需要的话)传达到解析器。词法分析器使叫做 yylex 的整数值的 函数。这个函数返回一个整数的记号编号,它表示读取的记号的种类。 如果这个记号关联着一个值,应当把它赋予外部变量 yylval。 为使通信得以发生,解析器和词法分析器必须在记号编号上达成 一致。编号可以由 Yacc 或用户来选择。在这两种情况下,使用 C 语 言的“# define”机制允许词法分析器使用符号来返回这些编号。例如, 假定在 Yacc 规定文件的声明段中已经定义记号名字 DIGIT。 它的意图是返回一个 DIGIT 记号编号,和等于这个数字的数值 的一个值。倘若词法分析器代码位于规定文件的程序段,标识符 DIGIT 将被定义为与记号 DIGIT 关联的记号编号。 这种机制导致清晰的、易于修改的词法分析器;唯一的缺点是在 文法中需要避免使用任何在 C 语言或解析器中保留的或有意义的记 号名字;例如,使用记号名字 if 或 while 就一定会导致编译词法分 析器时出现严峻的困难。记号名字 error 保留给错误处理,不应该随 便使用。 同上所述,记号编号可以由 Yacc 或用户来选择。在缺省的条件 下,编号由 Yacc 选择。文字字符的缺省记号编号是它在本地字符集 中的字符数值。其他名字赋予从 257 开始的记号编号。 要把一个记号编号赋予一个记号(包括文字),可以在声明段中记 号或文字的第一次出现时直接跟随着一个非负整数。这个整数被接受
附录一:yacc 程序,加注释................................................................................................................10 附录二:词法分析器的工作原理 ........................................................................................................13
一:实验内容:wk.baidu.com
编写语法分析程序,实现对算术表达式的语法分析,要求所分析 的算术表达式由如下的文法产生。
◆E->E+T|E-T|T ◆T->T*F|T/F|F ◆F->id|(E)|num
二:实验要求:
在对表达式进行分析的同时,输出所采用的产生式。 可以采用多种方法 ◆编写递归调用程序,实现自顶向下的分析。 ◆编写 LL(1)语法分析程序,要求: ◇编程实现算法 4.2,为给定的文法自动构造预测分析表 ◇编程实现算法 4.1,构造 LL(1)预测分析程序, ◆编写语法分析程序,实现自底向上的分析,要求: ◇构造识别所有活前缀的 DFA ◇构造 LR 分析表 ◇编程实现算法 4.3,构造 LR 分析程序 ◆利用 yacc 自动生成语法分析程序,调用 LEX 自动生成的词法 分析器程序
安装中可能是不同的)。Yacc 生成的函数叫 yyparse;它是整数值的 函数。在调用的时候,它依次重复的调用用户提供的词法分析器 yylex 来获得输入记号。最终,要么是检测到一个错误,在这种情况下(如 果没有错误修复是可能的) yyparse 返回值 1,要么词法分析器返回 结束标记记号并且解析器接受。在这种情况下,yyparse 返回值 0。 用户必须为解析器提供特定数量的环境来获得一个工作的程序。例如, 同每个 C 程序一样,必须被定义程序调用的 main(),它最终调用 yyparse。此外,叫做 yyerror 的一个例程在检测到语法错误的时候打 印一个消息。 用户必须以某种形式提供这两个例程。为了减轻使用 Yacc 的起初努 力,提供了带有缺省版本的 main 和 yyerror 的一个库。这个库的名 字是依赖系统的;在很多系统上使用到装载器的 -ly 参数来访问这个 库。到 yyerror 的参数是包含错误信息的字符串,通常是字符串 “syntax error”。 一般的应用可能需要更好的消息。通常,程序跟踪 输入行数,并与检测到的语法错误一起打印。外部整数变量 yychar 在检测到错误的时候包含超前记号的编号;这对给出更好的诊断有好 处。因为 main 程序(需要读参数等等)大多数时候是用户提供的。Yacc 库只在小项目或大点的项目的早期阶段有用。 外部整数变量 yydebug 通常设置为 0。如果设置为非零的值,解析 器会输出对它的动作的一个冗余的描述,包括对已经读入哪个输入符 号和解析器动作是什么的讨论。依赖于操作系统,可以通过使用调试 系统来设置这个变量。
第四:YACC 内部名称: ................................................................................................ 7 第五:运行结果(源代码见附录).............................................................................. 8 第六:实验总结 ............................................................................................................... 8 第七:附录 ..................................................................................................................... 10
语法分析程序的设计与实现
一:实验内容: ............................................................................................................... 1 二:实验要求: ............................................................................................................... 2 三:实验方法: ............................................................................................................... 2
的定义,这一 yylex()就可以访问 YACC 中记号的名字,因为 LEX 的 输出时候 YACC 输出文件的一部分,所有,每个 LEX 的动作都返回 YACC 知道的终结符。
在 UNIX 的环境下,如果 LEX 源程序在 first.l 中,YACC 的源程 序在 second.y 中,可以使用以下命令得到所需要的分析程序。
◆解析器如何工作 Yacc 把规定文件转换成 C 程序,它依据给出的规定解析输入。 做从规定到解析器转换的算法是复杂的,就不在这里讨论了(更多信 息参见引用)。但是,解析器自身就相对简单了,理解它是如何工作 的,尽管不是严格必须的,但会使错误修复和歧义处置更加易于理解。 Yacc 提供的解析器是由带有一个栈的有穷状态自动机组成。解析器 自身还有能力读取和记住(叫做超前(lookahead)记号)下一个输入记号。 当前状态总是在栈顶。有穷状态自动机的状态是一个给定的小整数标 签(label);最初时,机器是在状态 0 下,栈只包含状态 0,没有读取 超前记号。 机器对它只能获得四个动作,叫做移进(shift)、归约(reduce)、接受和 错误。 ◆Yacc 环境 在用户向 Yacc 输入规定的时候,在多数系统上输出文件是叫做 y.tab.c 的一个 C 程序文件(因为本地文件系统惯例,它的名字在不同
相关文档
最新文档