文档详情

编译原理第14章-pl0.ppt

发布:2017-06-03约4.35万字共94页下载文档
文本预览下载声明
PL/0 编译程序的语法分析 分析方法 借助于PL/0的语法描述图或EBNF表示进行 自顶向下分析 合法的PL/0程序都可以对应一棵自顶向下构 造的语法分析树 语法分析树的根节点为程序,叶节点为构 成源程序的单词,每个内部节点代表构成源 程序的各种不同的语法单位 PL/0 编译程序的语法分析 VAR A; BEGIN READ(A) END. 程序 自顶向下分析举例 分程序 . 变量说明部分 语句 标识符 VAR ; 复合语句 语句 BEGIN END 读语句 ( ) 标识符 READ A A 自顶向下进行 递归下降分析 PL/0 编译程序的语法分析 实现方法 递归子程序法 可以自然实现递归下降分析过程 每个语法单位都对应一个分析子程序,其设 计基于该语法单位的语法描述图或EBNF表示 递归下降分析过程从调用语法单位程序对 应的子程序开始,运行时的调用关系反映了 语法分析树的结构 PL/0 编译程序的语法分析 递归子程序的设计 沿语法分析图箭头所指方向进行如下工作: 遇到一个语法单元,调用相应的子程序 遇到一个词法单位,则判断当前读入的单词 是否与该词法单位相匹配,若匹配,再读取 下一个单词继续分析;若不匹配,则进行出 错处理 利用EBNF的方法与此相似 PL/0 编译程序的语法分析 递归子程序的设计实例 表达式 ::= [ + | - ] 项 {( + | - ) 项 } int expression(…) { if (sym==plus || sym==minus) {/* 此时表达式被看作正的或负的项 */ getsym(); term (…); /* 处理项 */ } else /* 此时表达式被看作项的加减 */ { term (…); /* 处理项 */ } while (sym==plus || sym==minus) { getsym; term (…); /* 处理项 */ } return 0; } PL/0 编译程序的语法分析 递归子程序的设计实例 项 ::= 因子 { (* | / ) 因子 } int term(…) { factor(…); /*处理因子*/ while (sym==times || sym==slash) { getsym(); factor (…); /* 处理因子 */ } return 0; } PL/0 编译程序的语法分析 递归子程序的设计实例 因子 ::= 标识符 | 无符号整数 | ‘(’ 表达式 ‘)’ int factor (…) { if (sym==ident) {/* 因子为常量或变量 */ getsym(); else if (sym==number) /*因子为立即数*/ getsym(); else if (sym==lparen); /* 因子为立即数*/ { expression(…); if (sym==rparen) getsym(); else error(22); /*提示22号出错信息:缺少右括号*/ } return 0; } PL/0 编译程序的语法分析 PL/0 语法分析程序入口 程序 ::= 分程序 . int main() { … /*初始化*/ … /*读写文件*/ getsym(); block(…) /* 处理分程序*/ … if (sym != period) error(9); /*提示 9 号出错信息:缺少程序结束符’.’*/ … return 0; } PL/0 编译程序的语法分析 主要语法单位相应子程序之间的调用关系 PL/0 编译程序的语义分析 功能 借助符号表进行上下文相关的静态语义分析 确保符号表可
显示全部
相似文档