- 2
- 0
- 约7.36万字
- 发布于河北
- 举报
- 文档已下架,其它文档更精彩
第M章充力的微处理器
3.1语法分析的若干问题
3.2上下文无关文法(ContextFreeGrammar,CFG)
3.3语言与文法简介
3.4自上而下语法分析
3.5自下而上语法分析
3.6本章小结
第M章充”够微处理器
/辛二日一^a~d—金―aja,^a:二在二点二
3.180x86微处理器简介
3.1.1语法分析器的作用
语法分析器是编译器前端的重要组成部分,许多编译器,特
别是由自动生成工具构造的编译器,往往其前端的中心部件就是
语法分析器。语法分析器在编译器中的位置和作用如图3.1所示,
它的主要作用有两点:
(1)根据词法分析器提供的记号流,为语法正确的输入构造分
析树(或语法树)。这是本章的重点,在以后各节中详细讨论;
(2)检查输入中的语法(可能包括词法)错误,并调用出错处理
器进行适当处理。下边简单介绍语法错误处理的基本原则,而在
以后的讨论中忽略此日里一一一*七
0
*T金金—,士
图3.1语法分析器在编译器中的位置与作用
第M章路器微处理器
/辛二日一^a~d—金―aja,^a:二在二点二
3.1.2语法错误的处理原则™
1.源程序中可能出现的错误
源程序中可能出现的错误可以分为两类:语法错误和语义错误
其中,语法错误又包括词法错误和语法错误。词法错误指出现非
法字符或关键字、标识符拼写错误等;语法错误是指语法结构出
错,如少分号、begin/end不配对等。语义错误包括静态语义错误
和动态语义错误。静态语义错误涉及的是编译时可检查出来的错
误,如类型不一致、参数不匹配等;动态语义错误一般是指程序
运行时的逻辑错误,如无穷递归、变量为零时作除数等。
大多数错误的诊断和恢复集中在语法分析阶段,一个原因是大
多数错误是语法错误,另一个原因是语法分析方法的准确性,它
们能以非常有效的笆诊断语法错误。在编译的鳖,想要准确
地诊断语义或逻辑错误有时是很困难的一一一^tfc
2.语法错误处理的目标
对语法错误的处理,一般希望达到以下基本目标:
①清楚而准确地报告错误的出现,地点正确、不漏报、不错
报也不多报;
②迅速地从每个错误中恢复过来,以便分析继续进行;
③对语法正确源程序的分析速度不应降低太多。
这些目标看起来容易,但是实现起来并不简单。幸好常见的
错误是简单的,直接了当的出错处理机制一般就足以应付。但有
些时候,错误的实际位置远远前于发现它的位置,并且这种错误
的准确性也难以推断。在某些场合,出错处理程序可能需要猜测
程序员的本意。
有些分析方法,如LL和LR方法,可以尽可能快地检测语法
错误。更准确地说,它们具有“活前缀”(viable-prefixproperty)
性质,这指的是,它们一看见输入的前缀不是该语言任何串的前
缀时,就能报告错误。出错处理的关键是如何从错误中恢复,使
分析可以进行下去,而不是遇到第一个错误就停止分析。
第3章充”器微处理器
三4■金N1二W—金—金可三L4』[3^口二JT2在二g
3.语法错误的基本恢复策略
若希望编译器的语法分析方式是每次对输入源程序完整地扫描
一遍,而不是遇到第一个语法错误就停止的话,就需要采取某种
恢复策略,使得分析在遇到错误时还能够继续进行。以下是一些
可能的恢复策略。
(1)紧急方式恢复(Panic-moderecovery):这是最简单的方法,
适用于大多数分析方法。发现错误时,分析器每次抛弃一个输入
记号,一直向前搜索,直到输入记号属于某个指定的合法记号(称
为同步记号)集合为止。同步记号一般是定界符,如分号或end等,
它们在源程序中的作用很清楚。当然,设计编译器时必须选择适
当的同步记号。这种处理方法最简
原创力文档

文档评论(0)