logo资料库

语法分析器的设计与实现.docx

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
1 算法分析与设计
2 详细设计
3 关键代码
4对本设计的简单评述、总结或体会
5 参考文献
你的学校 学 院 课程设计说明书 题 院 姓 学 目: 语法分析器的设计与实现 系: 名: 号: 专业班级: 任课教师: 马吉明 成 绩: 时间: 年 月 日至 年 月 日 1
2
你的学校 学 院 课程设计任务书 题目: 语法分析器的设计与实现 班级: 学号: 姓名: 主要内容 根据某一文法编制调试自顶向下语法分析器(递归下降分析程序、 LL ( 1 )分析程序),以便对任意输入的符号串进行自顶向下的语法分析。本次实 验的目的主要是加深对自顶向下的语法分析法的理解。 基本要求 采用文件操作,输入为 c 语言源程序,输出为经过语法分析的单词序列 或四元式形式的中间代码序列。 主要参考资料等: 《编译原理》 完 成 期 限: 指导教师签名: 课程负责人签名: 年 月 日 3
目录 1 算法分析与设计 ............................................................................................................................ 5 2 详细设计 ........................................................................................................................................ 6 3 关键代码 ........................................................................................................................................ 7 4 对本设计的简单评述、总结或体会...........................................................................................14 5 参考文献 ...................................................................................................................................... 14 4
1 算法分析与设计 ·为文法 G 的每个非终结符号 U 构造一个递归过程,不妨命名 为 U 。 U 的产生式的右边指出这个过程的代码结构: (1) 若是终结符号,则和向前看符号对照,若匹配则向前进一个 符号;否则出错。 (2) 若是非终结符号,则调用与此非终结符对应的过程。当 A 的 右部有多个产生式时,可用选择结构实现。具体为: ( 1 )对于每个非终结符号 U → u1|u2|…|un 处理的方法如下: U( ) { ch= 当前符号 ; if(ch 可能是 u1 字的开头 ) 处理 u1 的程序部分 ; else if(ch 可能是 u2 字的开头 ) 处理 u2 的程序部分 ; … else error() } ( 2 )对于每个右部 u1 → x1x2…xn 的处理架构如下: 处理 x1 的程序; 处理 x2 的程序; … 5
处理 xn 的程序; ( 3 )如果右部为空,则不处理。 ( 4 )对于右部中的每个符号 xi ① 如果 xi 为终结符号: if(xi= = 当前的符号 ) { NextChar() ; return; } else 出错处理 ② 如果 xi 为非终结符号,直接调用相应的过程 xi() 说明: NextChar 为前进一个字符函数。 2.LL(1) 下降分析器 实验设计思想:利用 LL ( 1 )控制程序根据显示栈栈顶内容、 向前看符号以及 LL ( 1 )分析表,对输入符号串自上而下的分析。 2 详细设计 ·程序输入 / 输出示例: 对下列文法,用递归下降分析法 /LL(1) 分析法, 对任意输入的符号串进行分析: ( 1 ) E → TG ( 2 ) G → +TG| — TG 6
( 3 ) G →ε ( 4 ) T → FS ( 5 ) S → *FS|/FS ( 6 ) S →ε ( 7 ) F → (E) ( 8 ) F → i 输出的格式如下: 1. 递归下降分析程序 /LL(1) 分析程序 2. 输入一以 # 结束的符号串 ( 包括 +-*/ () i#) :在此位置输入符号串例如: i+i*i# 3. 输出结果: i+i*i# 为合法符号串 4. 输出从文法开始符到句子的推导的全过程,或输出以下的分析过程: 步骤 分析栈 剩余输入串 所用产生式 1 E i+i*i# E →TG 3 关键代码 #include #include #include //用到了字符串 处理函数 strcat struct stack //stack 堆栈用来 存放推倒所用的产生式 { 7
stack *top; char value; }; char pop(stack *pst) //堆栈的出栈操 { char e; if(pst->top==pst) { printf("The stack is null."); return 0; } else e=pst->top->value; pst->top--; return e; { } } void push(stack *pst,char e) //堆栈的压栈操 { 作 作 8
分享到:
收藏