《编译原理及实践教程》第4章自上而下语法分析.ppt
文本预览下载声明
按照语法树的建立方法,可把语法分析方法分成两类: 自上而下分析法 自下而上分析法 LL(1)文法 问题:是否每个非终结符A的多个候选式不存在公共左因子,文法也不含左递归,就可以进行确定的自上而下的语法分析呢? 答:不能。 如文法对输入串dbc进行分析。 LL(1)文法 结论:并非所有的文法都能进行确定的自上而下的分析。 新问题:对于P→α1|α2|…|αn,当前输入串$:…αi…。能否有一种办法,只根据当前的αi就能在α1、α2、…、αn中准确地选择一个候选式进行匹配? 先给出两个定义:First集、Follow集。 算法4.1 计算非终结符A的First集。 例4.6 求下列文法中各个非终结符和各个候选式的First集。 基于LL(1)文法的语法分析程序实现 有两种确定的自上而下的语法分析方法: 递归下降的语法分析方法 预测分析方法(也称LL(1)分析方法) 预测分析过程举例 例4.11 使用表4.1对输入串i+i*i 进行语法分析。 程序结构与伪代码 若非终结符U的产生式形如U→u1|u2|…|un,其递归子程序的原型如下: U( ){ ch=当前输入符号; if(ch∈First(u1)) 调用u1( ); else if(ch∈First(u2)) 调用u2( ); ┆ else if((ε∈First(U))(ch∈Follow(U))); else error( ) ; } 代码说明:P87 对于U的每个右部ui=x1x2…xn的处理架构如下: ui( ) { 处理x1子程序; 处理x2子程序; ┆ 处理xn子程序; } 处理xi子程序 { if (xi是终结符) match(ch); else xi( ) } void match(token ch ) { if (xi==ch) //与当前输入符号相同? { ch=getnexttoken( ); // 取下一个符号 return; } else error( ); //不匹配,进行出错处理 } 例4.10 编写例4.4中的文法G4.2对应的递归下降分析程序。 (解答看教材87页) E ?TEE ? +TE |εT ? FTT ? *FT |εF ?(E) |i 实例:写IF语句的递归下降的分析程序 方法:在给定的语法定义中选择与IF语句有关的产生式,再对每个非终结符写一个函数。 if语句 ::= if 布尔表达式 then 执行句 布尔表达式 ::= 变量关系符变量 关系符 ::= | | | = | = | = 执行语句 ::= 变量:=整数 变量 ::= 标识符 整数 ::= 数字 | 整数 数字 数字::=0|1|2|3…|9 对应于非终结符if语句,有产生式 if语句 ::= if 布尔表达式 then 执行句 则if语句对应的函数可描述为: ifs() { token =getnexttoken(); If (token !=“if”) error; token = getnexttoken(); bool_expr(); token = getnexttoken(); If (token !=“then”) error; token = getnexttoken(); exe_sentence(); } 相应于非终结符布尔表达式,有产生式: 布尔表达式 ::= 变量关系符变量 布尔表达式的函数可描述为: bool_expr() { gettoken(); handle_varible(); Getnexttoken(); If (token not in ! ( | | | = | = | = ) error; Getnexttoken(); handle_varible(); } 练习:请写出for语句的递归下降的分析程序: for语句::= for 标识符:=算术表达式1 to 算术表达式2 do 执行句 算术表达式::=算术表达式±项|±项|项 项::= 项*因子|项/因子|因子 因子::=算术量 算术量::=标识符|整数 执行语句 ::= 变量:=整数 执行语句 ::= for语句 …………. 递归分析程序的优缺点 优点:实现思想简单
显示全部