用于消除语法分析冲突的yacc文法变换模式

合集下载

第5章 语法分析(2)自下而上分析

第5章 语法分析(2)自下而上分析

则成功,达不到这种格局则输入串有错误。

栈中符号串+剩余输入串 = 规范句型。
26
规范归约分析算法
1. 在栈底放入# ,在输入串尾附上#; 2. 逐个移入输入符号,当栈顶形成句柄时,进行归约; 3. 重复2 直到输入串已全部进栈,仅剩#, 4. 若栈中归约为#S, 表示分析成功,输入串为合法的 句子,否则为非法句子.
2
5.1 自下而上分析的基本问题

自下而上分析法的基本思想:
从输入串出发,反复利用产生式逐步进行 ‚归约‛,如果最后能归约到文法的开始符 号,则输入串是句子,否则输入串有语法错 误。

各种不同自下而上分析法一个共同特点是:
边输入单词符号(移进栈),边归约;
3
5.1 自下而上分析的基本问题

自下而上分析的基本技术是采用归约栈,如下图所示: #

或者说从文法的开始符号产生句子。

自下而上分析采用的方法是归约,从叶子到根构造分析树。

或者说从句子开始归约出文法的开始符号。

语法树的一个子树:由该树的某个结连同它的所有子孙组成。 在自下而上分析过程中,每一步归约都可画出一棵子树。
例如,上例中的归约过程可描述为如下分析树:
9
例5.2:文法G[S], 其4条产生式如下: ① S→aABe ② A→b ③ A→Abc ④ B→d 对句子abbcde的分析 最右推导 SaABeaAdeaAbcdeabbcde 最左归约 abbcde,aAbcde ,aAde,aABe ,S S S aABe aAde aAbcde abbcde
S (2)每次归约用的句柄: , (a,(a)), , , , , , ( (L,(S)) (L,(L)) (L,S) (L) S (S,(a)) (L,(a)) L )

编译原理课后习题答案清华大学第二版

编译原理课后习题答案清华大学第二版
if 〈条件〉 then 〈语句〉 [else〈语句〉 ] (2) 扩充 repeat 语句为:
repeat 〈语句〉 {;〈语句〉 }until 〈条件〉
EBNF 的语法描述。
答案: 对 PL/0 语言作如下功能扩充时的语法图和 EBNF 的语法描述如下:
(1) 扩充条件语句的语法图为:
EBNF 的语法描述为: 〈条件语句〉 ::= if 〈条件〉 then〈语句〉 [else〈语句〉 ] (2) 扩充 repeat 语句的语法图为:
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。
第 3题
何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系?
答案:
翻译程序是指将用某种语言编写的程序转换成另一种语言形式的程序的程序,
如编译程
序和汇编程序等。
编译程序是把用高级语言编写的源程序转换 (加工) 成与之等价的另一种用低级语言编
写的目标程序的翻译程序。
解释程序是解释、执行高级语言源程序的程序。解释方式一般分为两种:一种方式是,
源程序功能的实现完全由解释程序承担和完成,即每读出源程序的一条语句的第一个单词,
则依据这个单词把控制转移到实现这条语句功能的程序部分,
该部分负责完成这条语句的功
能的实现, 完成后返回到解释程序的总控部分再读人下一条语句继续进行解释、
EBNF 的语法描述为: 〈 重复语句〉 ::= repeat〈语句〉 { ;〈语句〉 }until 〈条件〉
《编译原理》课后习题答案第三章
第 3 章 文法和语言
第 1题
文法 G = ({A,B,S},{a,b,c},P,S) 其中 P 为:
S→ Ac|aB A→ ab B→bc 写出 L(G[S]) 的全部元素。

语法分析—自下而上分析

语法分析—自下而上分析

i3 E⇒* i1*i2+F F⇒i3
D.短语:i1*i2+i3---是自身的短语
E⇒0 E E+⇒i1*i2+i3
15
例1: E→E+T | T T→T*F | F F→(E) | i i1*i2+i3
E
E+ T
T
F
T*F
i3
F
i2
i1
短语: i1,i2,i3,i1*i2,i1*i2+i3 直接短语: i1,i2,i3 句柄: i1
E
E E+ E
E*E i
i
i
5
第五章 语法分析—自下而上分析
5.1 自下而上分析基本问题 5.2 算符优先分析 5.3 LR分析法 5.4 语法分析器的自动产生工具YACC(略)
6
5.1 自下而上分析基本问题
一、归约 1.“移进—规约”的思想:
用一个寄存符号的先进后出栈,把输入符号一个 一个地移进栈里,当栈顶形成某个产生式的一个候选 式时,即把栈顶的这一部分替换成(归约为)该产生 式的左部符号。
动作 进 进 归,用F→i 归,用T→T*F 归,用E→T 进
26
步骤 9 10 11 12 13 14
• G(E):
E T | E+T T F | T*F F (E) | i
符号栈 #E+ #E+i3 #E+F #E+T #E #E
输入串 i3# # # # # #
动作 进 进 归,用F→i 归,用T→F 归,用E→E+T 接受
27
回顾:归约
• 采用“移进-归约”思想进行自下而上分析。 • 基本思想:用一个寄存符号的先进后出栈,把输

编译原理第三版答案

编译原理第三版答案

编译原理第三版答案第一章答案1.问题:什么是编译器?答案:编译器是一种将源程序转换为目标程序的软件工具。

它负责对源代码进行词法分析、语法分析、语义分析和代码生成等一系列操作,最终生成可执行的目标程序。

2.问题:编译器的主要任务是什么?答案:编译器的主要任务是将高级语言程序转换为能被计算机硬件执行的机器码。

它包括了对源代码进行词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等过程。

3.问题:编译器的工作过程是什么?答案:编译器的工作过程分为多个阶段。

首先是词法分析,将源代码拆分成一个个的词法单元。

然后是语法分析,根据语法规则构建语法树。

接着是语义分析,对语法树进行检查,确保程序的语义正确。

之后是中间代码生成和优化,将语法树转换为更加高效的中间代码。

最后是目标代码生成,将中间代码转换为特定的目标机器代码。

4.问题:编译器的优化技术有哪些?答案:编译器的优化技术包括了常量折叠、公共子表达式消除、循环优化、函数内联和代码重排等。

这些技术可以提高程序的执行效率和优化代码的空间利用率。

5.问题:编译器的应用领域有哪些?答案:编译器广泛应用于软件开发领域。

它们被用于将高级语言转换为目标机器码,用于开发操作系统、编程语言和应用软件等。

第二章答案1.问题:什么是有限自动机(DFA)?答案:有限自动机是一种表示有限状态和状态之间转换关系的模型。

它可以根据输入字符进行状态转换,最终决定是否接受某个字符串。

2.问题:有限自动机的主要组成部分是什么?答案:有限自动机主要由状态集合、输入字符集、转移函数、初始状态和接受状态集合组成。

3.问题:什么是正则表达式?答案:正则表达式是一种用于描述字符串模式的表达式。

它由普通字符和特殊字符组成,可以用于匹配符合条件的字符串。

4.问题:正则表达式的常用操作符有哪些?答案:正则表达式的常用操作符包括了字面量字符、字符类、重复操作符、选择操作符和位置操作符等。

5.问题:正则表达式如何转换为有限自动机?答案:正则表达式可以通过字面化、连接、选择和闭包等操作转换为等价的有限自动机。

简单优先文法

简单优先文法

简单优先文法简单优先文法是在文法推导过程中用来解决移进-归约冲突的一种方法,它是一类优先文法。

在编译原理中,优先文法对于构建语法分析器起到了至关重要的作用。

在本文中,我们将介绍简单优先文法的基础知识以及如何使用它来解决移进归约冲突。

简单优先文法定义了一个基本的优先级规则,该规则帮助语法分析器判断哪些产生式可以被应用。

在简单优先文法中,每个终结符和非终结符都有一个关联的优先级。

如果两个符号之间存在不同的优先级,语法分析器将使用较高优先级的符号。

例如,在表达式语法中,乘法和除法的优先级通常比加法和减法更高。

如果两个符号具有相同的优先级,则语法分析器将根据文法中定义的结合性规则来解决冲突。

例如,在表达式语法中,加法和乘法都是左结合的,而减法和除法都是右结合的。

基于简单优先文法的语法分析器通常被称为“算符优先分析器”。

这种类型的语法分析器使用状态转移表来确定如何移进或归约输入令牌序列。

它能够有效地处理大量的语法结构,并且速度比其他分析器更快。

下面给出一个简单的例子,以便更好地理解简单优先文法的原理。

假设我们有一个文法:S -> aA | bBA -> c | AaB -> c | Bb我们将给终结符 a 、 b 和 c 分配优先级 1 、 2 和 3 。

由于 a 和 b 具有相同的优先级,而 c 的优先级更高,因此,在 A 和 B 的产生式中,应用与终结符 c 相关联的优先级。

也就是说,在文法中,乘法和除法的优先级较高,加法和减法的优先级较低。

使用这种优先级规则,我们可以消除移进-归约冲突。

例如,在状态 S3 中,如果输入令牌是 a ,它将通过规则 S -> aA 被移进栈中。

如果该输入令牌是 c ,则可以将规则 A -> c 归约为 A ,以便栈中的符号与产生式 S -> bB 匹配。

这可以通过优先级规则来确定。

在编写简单优先文法时,必须避免悬挂文法以及二义性书写,否则将导致矛盾。

编译原理语法分析(1)

编译原理语法分析(1)

例如, 考虑句子 i+i*i 按文法G[E]的推导 最左推导: EE+Ei+Ei+E*E i+i*E i+i*i 最右推导: EE+EE+E*EE+E*i E+i*ii+i*i 注意: 推导过程不唯一, 通常只考虑最左 推导或最右推导。 最右推导又称为规范推导。 规范推导的逆过程称为规范归约。
+ 。 * 意味着或 = , 或 即1 n 1 n 1 n
例如,考虑算术表达式文法G[E]: E→E+E∣E*E∣(E)│i 非终结符E代表一类算术表达式, 从E出发可进行一系列推导, 表达式 i+i*i 的推导如下: E E+E E+E*E E+E*i E+i*i i+i*I 注意: 在每一步推 导中,只能对其中一个 非终结符用其对应的产生式右部的 一个候选式来替换。
文法可表示为 VN为非空非终结符集,且VT∩VN=Φ; (3) S为文法开始符, S∈VN; (4)ξ是产生式的非空有限集, 其中每个 产生式(规则)记作 → 或 ::= 左部∈(VT∪VN)+至少含一非终结符, 右部∈(VT∪VN)*。
B
3.1.3 正规式与上下文无关文法 1. 正规式到上下文无关文法的转换 由正规式构造CFG的一种方法: (1)构造正规式的NFA; (2)若0为初始状态, 则A0为开始符; (3)若存在映射关系f(i,a)=j, 则定义产生式Ai →aAj; (4)若存在映射关系f(i,ε)=j, 则定义产生式Ai →Aj; (5) 若i为终态, 则定义产生式Ai →ε。
产生式 (也称产生式规则或规则) 是 定义语法实体的一种书写规则。一个语 法实体的相关规则可能不止一个, 如: P→1, P→2 , P→n 相同左部的产生式可合并为一个: P→ 1| 2|„| n 其中, i(i=1,2,„,n)称为P的候选式。

数据库的yacc解析

数据库的yacc解析全文共四篇示例,供读者参考第一篇示例:数据库的Yacc解析Yacc(Yet Another Compiler Compiler)是一个生成解析器的工具,用来根据用户定义的文法来生成解析器。

在数据库领域,Yacc也被广泛应用于解析SQL语句,将用户输入的SQL语句转换为内部数据结构以便数据库系统进行解析和执行。

数据库中的Yacc解析主要包括词法分析和语法分析两个阶段。

词法分析阶段负责将输入的字符串分解成单词(token),然后传递给语法分析器进行处理。

语法分析阶段根据事先定义的文法规则,将单词序列转换为语法树或语法图,以表示语句的结构和含义。

在数据库系统中,SQL是最常见的数据库查询语言,因此Yacc解析器通常用于解析SQL语句。

SQL语句通常由多个部分组成,包括SELECT子句、FROM子句、WHERE子句等,每个子句又包含多个关键字和表达式。

Yacc解析器的任务就是将输入的SQL语句转换为相应的语法树,以便数据库系统能够对其进行解释和执行。

Yacc解析器生成的语法树通常包含多个节点,每个节点代表一个语法结构或操作符。

通过遍历语法树,数据库系统可以逐层解析SQL 语句,并执行对应的数据库操作。

对于一个SELECT语句,语法树的根节点可能表示SELECT操作,而子节点则表示SELECT子句中的列名、表名、条件等。

数据库的Yacc解析在实际应用中扮演着至关重要的角色。

通过Yacc解析器,数据库系统能够高效地解析用户输入的SQL语句,确保其语法正确性,并将其转换为可执行的数据操作。

Yacc解析器还能够支持SQL语句的扩展和变种,为数据库系统提供更多的灵活性和功能。

为了实现一个高效的数据库Yacc解析器,需要设计一个合理的文法规则,并结合合适的语法分析技术。

常见的语法分析技术包括LL(k)分析、LR(k)分析、LL(1)分析、LR(1)分析等,每种技术都有其适用的场景和优缺点。

在实际应用中,需要根据具体的需求和场景选择适合的语法分析技术,以实现高效和准确的语法解析。

编译原理第6章_1


STACK REMAINING INPUT
1
(int + int)#
2(
int + int)#
3 (int
+ int)#
4 (T
+ int)#
5 (E
+ int)#
6 (E +
int)#
7 (E + int
)#
8 (E + T
)#
9 (E
)#
10 (E)
#
11 T
#
12 E
#
13 S
#
PARSER ACTION Shift Shift Reduce: T –> int Reduce: E –> T Shift Shift Reduce: T –> int Reduce: E –> E + T Shift Reduce: T –> (E) Reduce: E –> T Reduce: S –> E
的左部而得到的
文法要求
shift-reduce or reduce-reduce 冲突(conflicts)
分析程序不能决定是shift 还是 reduce 或者分析程序归约时有多个产生式可选
例子 (dangling else) : S –> if E then S | if E then S else S
LR分析算法
then begin pop || 项 令当前栈顶状态为S’ push GOTO[S’, A]和A(进栈)
end else if ACTION[s,a]=acc
then return (成功) else error end

词法分析、语法分析、语义分析

词法分析、语法分析、语义分析词法分析(Lexical analysis或Scanning)和词法分析程序(Lexical analyzer或Scanner) 词法分析阶段是编译过程的第⼀个阶段。

这个阶段的任务是从左到右⼀个字符⼀个字符地读⼊源程序,即对构成源程序的字符流进⾏扫描然后根据构词规则识别单词(也称单词符号或符号)。

词法分析程序实现这个任务。

词法分析程序可以使⽤lex等⼯具⾃动⽣成。

语法分析(Syntax analysis或Parsing)和语法分析程序(Parser) 语法分析是编译过程的⼀个逻辑阶段。

语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.源程序的结构由上下⽂⽆关⽂法描述.语义分析(Syntax analysis) 语义分析是编译过程的⼀个逻辑阶段. 语义分析的任务是对结构上正确的源程序进⾏上下⽂有关性质的审查, 进⾏类型审查.例如⼀个C程序⽚断: int arr[2],b; b = arr * 10; 源程序的结构是正确的. 语义分析将审查类型并报告错误:不能在表达式中使⽤⼀个数组变量,赋值语句的右端和左端的类型不匹配.Lex ⼀个词法分析程序的⾃动⽣成⼯具。

它输⼊描述构词规则的⼀系列正规式,然后构建有穷⾃动机和这个有穷⾃动机的⼀个驱动程序,进⽽⽣成⼀个词法分析程序.Yacc ⼀个语法分析程序的⾃动⽣成⼯具。

它接受语⾔的⽂法,构造⼀个LALR(1)分析程序.因为它采⽤语法制导翻译的思想,还可以接受⽤C语⾔描述的语义动作,从⽽构造⼀个编译程序. Yacc 是 Yet another compiler compiler的缩写.源语⾔(Source language)和源程序(Source program) 被编译程序翻译的程序称为源程序,书写该程序的语⾔称为源语⾔.⽬标语⾔(Object language or Target language)和⽬标程序(Object program or Target program) 编译程序翻译源程序⽽得到的结果程序称为⽬标程序, 书写该程序的语⾔称为⽬标语⾔.中间语⾔(中间表⽰)(Intermediate language(representation)) 在进⾏了语法分析和语义分析阶段的⼯作之后,有的编译程序将源程序变成⼀种内部表⽰形式,这种内部表⽰形式叫做中间语⾔或中间表⽰或中间代码。

精品 课后习题及参考答案-《编译原理》课后习题答案-清华大学-第二版

广义上讲,编译程序和解释程序都属于翻译程序,但它们的翻译方式不同,解释程序是边 翻译(解释)边执行,不产生目标代码,输出源程序的运行结果。而编译程序只负责把源程序 翻译成目标程序,输出与源程序等价的目标程序,而目标程序的执行任务由操作系统来完成, 即只翻译不执行。
对下列错误信息,请指出可能是编译的哪个阶段(词法分析、语法分析、语义分析、 代码生成)报告的。
总而言之,是边翻译边执行。
像C, Pascal之类的语言,属于编译型的高级语言。它们的特点是计算机事先对高级语言 进行全盘翻译,将其全部变为机器代码,再统一执行,即先翻译,后执行。从速度上看,编译型 的高级语言比解释型的高级语言更快。

第1题
PL/O语言允许过程嵌套定义和递归调用,试问它的编译程序如何解决运行时的存储管 理。
错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源程 序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误进行 适当的校正(修复),目的是使编译程序能够继续向下进行分析和处理。
注意:如果问编译程序有哪些主要构成成分,只要回答六部分就可以。如果搞不清楚, 就回答八部分。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和査找等一系列表格工作。表格的作用是记录源程序的各 类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中 间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出 的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序 具有的表格管理功能。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

路漫漫其修远兮,吾将上下而求索 - 百度文库 00 用于消除语法分析冲突的YACC文法变换模式 摘要:YACC是Unix/Linux上一个用来生成编译器的编译器(编译器代码生

成器)。YACC生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。YACC本来只在Unix系统上才有,但现时已普遍移植往Windows及其他平台。 本文分析了使用LAI R(1)分析程序生成系统YACC时经常遇到的语法分析冲突问题及消除语法。 分析冲突的策略,总结了一组文法变换模式,利用这些模式可以有效地解决语法分析冲突阉题。

关键词: YACC 语法分析 冲突文法变换 模式 路漫漫其修远兮,吾将上下而求索 - 百度文库

11 引言 YACC(Yet Another Compiler Compiler)是美国贝尔实验室著名的编译程序生成系统,用于开发以字符流输入的,语法制导的软件,如计算机语言的编(翻)译程序、解释程序、程序理解和白盒测试工具、语法制导的编辑器等近年来许多利用YACC的开发工作均指出了消除语法分析冲突的困难性,如开发C/C++程序理解工具的前端_2 J、Fortran95至C++的翻译程序、测试及测试控制标记语言TTCN-3的语法分析程序L4 J、硬件描述语言VHDL的分析程序等.本文借鉴软件设计模式的研究方法,总结出7个用于消除语法分析冲突的文法变换模式.下面介绍文中用到的几个基本概念和有关约定.

一、概念和约定 在本文中,术语“YACC”代表采用u也R(1)分析方法的一大类语法分析程序生成系统,包括贝尔实验室的YACC[“、自由软件基金会(GNU)的BiSo一6 J及它们的所有变体,乙虬R(1)分析方法属于移进归约分析方法.所谓移进,是指分析栈中移人新的终结符号归约是指用一条产生式的左部符号替换若干个栈顶符号,出栈符号的数目取决于产生式右部的长度.文法的LALR(1)分析表记录了当分析器的状态为s,当前面临的输入符号为t时应该执行的分析动作如果分析表的一个人口中记录了两个不同的分析动作,则称该文法包含一个语法分析突.分析冲突有两种:移进一归约冲突和归约一归约冲突,一个文法是LALR(1)文法,当且仅当它的LAI R(1)分析表中不含语法分析冲突.“UR(1)文法属于无歧义的上下文无关文法子类.若一个文法是歧义的。那么它的LALR(1)分析表一定含有语法分析冲突.有关上下文无美文法、LR分析方法和YACC的知识,可参考《编译原理教材》,如[1]或[7].在下文列举的文法范例中,约定首字母大写的英文字符串表示文法的非终结符号,全小写的英文字符串代表文法的终结符号. 路漫漫其修远兮,吾将上下而求索 - 百度文库 22 二、 YACC的冲突消除规则 现今的程序设计语言的语法主要是采用上下文无关文法描述的,但是上下文无关文法并非能够描述计算机语言的全部语法结构,例如,C++、VHDL等语言的语法明显带有上下文相关性.用YACC开发这些语言的分析器不可避免地会存在语法分析冲突.另一方面,语言的设计者在设计一个语言的文法时一般不考虑它的分析程序如何构造,而是为了理解和维护语言的语义而设计.如此设计出的文法称为语义文法(semantic grammar).“标准”语言的文法可以从该语言的语言参考手册中获得,这样得到的文法往往是歧义文法.带有歧义的语义文法需要被改写为无语法分析冲突的分析文法(parsing grammar),才能用来开发语言的分析程序.对于开发者自定义的语言,特别是许多领域专用语言(domain—specificlanguage),需要由开发者自行设计它们的文法,消除语法分析冲突.YAcc支持用户自定义上下文无关的消歧规则,用于消除语法分析冲突,所谓上下文无关的消歧规则,是指这种规则不依赖于被分析程序的上下文环境.果没有在YACC的输入文法规范中指定文法符号的优先级和结合性,YACC将采用默认规则消除所有的冲突…: (1)遇到移进一归约冲突对选择移进; (2)遇到归约一归约冲突时按照在文法规范中先声明的产生式归约. 上述默认规则认为移进动作的优先级总是高于归约动作,先声明的产生式的优先级总是高于后声明的产生式,优先级的高低与发生冲突时被分析程序的上下文无关所以默认规则也是上下文无关的消歧规则.理论上已经证明,能用上下文无关的消歧规则解决的语法分析冲突,利用文法的等价变换也能解决,例如,图1左侧所示的简单表达式文法是一个歧义文法.对输入句子identify+identify‘identify,该文法的I,AI.R(1)分析器读入串identify+identify后,有两种可能的分析动作:按产生式Expr—Expr+Expr归约,或移进一个新的符号“*”.如果在文法规范中指定“*”号的优先级高于“十”号,便可消除该文法的歧义.即使不规定优先级,这个文法也可以被等价变换为图1右侧所示的无歧义文法. 路漫漫其修远兮,吾将上下而求索 - 百度文库 33 总而言之,使用YACC等常用的确定性分析程序生成系统,文法变换是主要的并且是最强的语法分析冲突消除手段.

三、文法变换模式 形式语言理论告诉我们,上下文无关文法的等价性、文法的歧义性都是不可判定问题.也就是说,任给一个文法G,不存在一个算法能够判断G是否为一个无歧义的上下文无关文法,也不存在这样的算法:该算法能够将G自动变换为G’,使得G’为一个无歧义的文法且L(G)=L(G’).实践中,人们只能运用那些经过验证的文法变换经验和技巧消除语法分析冲突.设计模式是软件工程领域的研究热点,它记录、提炼存在于软件开发人员头脑中反复出现的特定上下文中的共性问题及其经过多次验证的成功解.将3个文法变换技巧命名为3个I AIR(1)等价变换模式,但是没有给出进一步的定义和说明.结合长期以来的实践经验,我们将常用语法冲突消除技巧进一步总结为7个文法变换模式.模式的描述问题一直是模式研究的重点.使用形式化的记号表示模式的名称和解决方案,以便能够被计算机自动识别和抽取;用面向人的自然语言描述模式要解决的问题、问题出现的上下文和应用实铡,以便于交流和理解. 首先来看最常用的关键字模式. 关键字(keyword)模式消除语法分析冲突的通用方法是在语言中增加终结符作为保留的关键字.记为:introduce(keyword,X),其含义是为文法符号x定义的语言增加一个保留的关键字keyword作为文法的终结符号,语法分析程序生成系统的一个重要应用是支持软件项目和组织中的普通开发人员设计和实现领域专用语言。也称小语言(microlanguage或little language).关键字模式改路漫漫其修远兮,吾将上下而求索 - 百度文库 44 变了语言的定义。用于在语言设计中避免语法分析冲突,图2中的条件语句文法是歧义的,该文法关于句子ii exprl then if expr2 then stintl else stmt2有两棵不同的分析树.增加一个保留的关键宇endit",不仅可以消除文法的歧义,还可以使文法变得清晰直观. 路漫漫其修远兮,吾将上下而求索 - 百度文库

55 加宽(widen)模式.用语言范围更“宽”的文法符号替换语言范围较“窄”的文法符号,常常可以消除语法分析冲突widen模式记为:widen(r,X。珥玎",Xb。叫)该式的含义是产生式r右部 被另一个符号Xb,“替换,L(xbⅢ)兰L(Xnarrow).图3给出了用widen模式消除Java文法的一个归约一归约冲突的实例.widen模式扩充了文法定义的语言有时文法的等价变换难以消除语法分析冲突。可以尝试扩充待分析的语言,在语义处理阶段进一步执行合法性检查,缩小分析程序接受的语言范围,保持语言的原始定义如果分析程序的输人事先经过错误处理,则分析程序接受的语言范围可以扩大软件再(逆向)工程工具一般要求被分析的程序必须事先正确通过编译,待分析程序的语法错误已经在编译阶段被发现和纠正.因此,即使工具前端接受的语言范围被适当扩大,一般也不会对后端应用造成显著影响。优先级(precedence)模式.为产生式和文法符号设置优先级和结合性,消除文法歧义.优先级和结合性是语言的设计者给出的,通常只在语言参考手册或语言设计者规定了符号优先级时才能应用.优先级模式记为:precedence(z(a._e-.SOC。)>y(asso%))其含义是规定文法符号(产生式)的相对优先级和符号的结合性.词法反馈(1exical feedback)模式.让词法分析程序区分歧义的语法成分,将消除语法分析冲突的任务从语法分析阶段前移至词法分析阶段. 词法反馈模式记为:lexicalfeedbaek(X,。1,5C2,…,zH)上式的含义是将一个引起歧义的终结符号或非终结符号x区分为n种可能的终结符号z1,5c2,…,z。,由词法分析程序决定X的词法解释,词法反馈模式的应用范围很广.举一个例子,一些早期的计算机语言中关键字不是保留字,标识符可以与关键字取相同的名字.例如在PL/1语言中,下列语旬是合法的条件语句[s】: ifif=thenthenthen=if如果不区分if的词法解释,将会产生语法分析冲突.可将if和then区分为“关键字(keyword)”和“标识符(identify)”;每遇到~个 if或then,让词法分析程序根据上下文返给语法分析程序关键字或标识符.内嵌(inline)模式。inline模式用于减少分析方法展望的符号个数,使LALR(m)文法(m>1)等价变换为LALR(n)文法(nrn)上式中,非终结符号x出现在产生式r的右部,r1'r2,…,靠是定义x的其它产生式。用rl,r2,…,h右部的非终结符号替换r右部的X,往往可以消除

相关文档
最新文档