【编译原理】03语法分析

1,语法分析的若干问题

1.1 语法分析器的作用        

        编译器前端的重要组成部分:        

        (1) 根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树)。

         (2) 检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理。

语法分析器:

1、通用的语法分析方法

         Cocke-Younger-Kasami算法和Earley算法

2、自上而下

        对任何输入串,试图用一切可能的办法,从文法开始符号(根结点)出发,自上而下地为输入串建立一棵语法树;或者说为输入串寻找一个最左推导。

3、自下而上

       自上而下的一般方法: 消除左递归 提取左因子 递归下降分析 预测分析器

语法分析器在编译器中的位置与作用

1.2  语法错误的处理原则

1.2.1.源程序中可能出现的错误

语法错误

        词法错误:非法字符或关键字、标识符拼写错误等

        语法错误:语法结构出错,如少分号、{/}不配对等  

语义错误

        静态语义错误涉及的是编译时可检查出来的错误,如类型不一致、参数不匹配等;

        动态语义错误一般是指程序运行时的逻辑错误,如无穷递归、变量为零时作除数等。        

        大多数错误的诊断和恢复集中在语法分析阶段,一个原因是大多数错误是语法错误,另一个原因是语法分析方法的准确性,它们能以非常有效的方法诊断语法错误。在编译的时候,想要准确地诊断语义或逻辑错误有时是很困难的。

1.2.2.语法错误处理的目标

① 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;      

② 迅速地从每个错误中恢复过来,以便分析继续进行;      

③ 对语法正确源程序的分析速度不应降低太多。

1.2.3.语法错误的基本恢复策略

        希望编译器的语法分析方式不是遇到一个语法错误就停止,就需要采取某种恢复策略,使得分析在遇到错误时还能够继续进行。

        紧急方式恢复:这是最简单的方法,适用于大多数分析方法。

        短语级恢复:建立在产生式(CFG)的基础上,以短语为基本分析单元,同时也便于进行语法制导翻译,恢复得比紧急方式要精确,因此被认为是一种较为理想的恢复方式。

        出错产生式

        全局纠正

例题:

        下述两条是有语法错误的语句,其中第一条赋值句结束时忘记加分号:x = a + b             y = c + d; 

        紧急方式:  x = a + b + d; -- 丢弃b之后的若干记号,直到遇到同步记号+      

        短语级恢复:x = a + b;     -- 加入分号,使之成为一个赋值句             

2,上下文无关文法(CFG)

2.1  CFG的定义与表示    

2.1.1 定义

         定义3.1  上下文无关文法是一个四元组G =(N,T,P,S):      

        ① N是非终结符的有限集合(Nonterminals);      

        ② T是终结符的有限集合(Terminals),且N∩T=Φ;      

        ③P是产生式的有限集合(Productions),每个产生式形如: A→α,其中A∈N,被称为产生式的左部,α∈(N∪T)*,被称为产生式的右部,若α=ε,则称A→ε为空产生式(也可以记为A →);      

        ④ S是非终结符,被称为文法的开始符号(Start symbol)。 

2.2.2 例题:

        定义简单算术表达式的上下文无关文法G3.1=(N,T,P,S)如下所示。    

 N={E}   T={+,*,(,),–,id}    S=E    

 P:      

E → E + E        (1)        

E → E * E         (2)        

E → (E)            (3)          

E → –E            (4)          

E → id              (5) 

2.2.3 表示 

        1.由产生式集表示CFG        

        文法可以由其产生式集P代替,而不写四元组。CFG的产生式表示也被称为巴克斯范式(BNF),值得注意的是,规范的BNF中,“→”用“::=”表示。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值