- 1、本文档共91页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PL0编译程序实例剖析剖析
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(); term (…); /* 处理项 */ } 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 编译程序的语义分析 功能 借助符号表进行上下文相关的静态语义分析 确保符号表可以
文档评论(0)