- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算机科技学院02级1班刘福祥20020706.doc
计算机科技学院 02级1班 刘福祥
大作业流程
主文件:main()
调用 cifa() 外定义 变量 ci=1 如果词法有错 ci=0
词法分析:
1.读: 读文件到数组 st 以数组为输入流做词法分析
2.分割:读 st 数组的前一部分,知道遇到分割符,保存到数组 str
3.调用:转换函数 - zhuanhuan(str)
(1)分析是否是正确的字符传(用自动机), shu(char *s) 分析单个数 bianliang(char *s)分析字符串 suanfu(char *s)分析算符
(2)转换为文法分析的数据流data,同时保存正确的变量到同一下标的结构体数组 shux (如果是数用 shux.i保存,如果是变量用 shux.d 保存)
如果ci=1 调用 wenfa(char *s)
文法分析:LL(1)文法,用 *s 指向数组data作为分析数据,数组 zhan 放文法分析数据
1.读data,zhan的头字符,做文法分析,
(1) 调用文法表 wenfabiao(ch) 函数 直接根据data,zhan的首字符改变zhan顶的内容
(2) 判断data,zhan的首字符,把相同的部分削掉,
(3) 判断是否结素,是 返回 ,否 读下一字符,循环到(1)
如果文法通过 调用 sibegin()
四员式生成:用循环调用
1.读data 的内容分析生成结构体数组 shi(w.运算符 opr1.操作数1的下标 opr2.操作数2的下标 temp.保存数组下标)由于opr1 opr2 temp 都是正数,为了区分操作符部分是‘操作数1的下标’和‘保存数组下标’temp 用负数表示,即真正下标的相反数减1.
2.zhuan1() 分析单句的表达式,zhuan2() 分析大括号的所有内容,zhuang() 分析get语句,zhuanp() 分析put语句,zhuanawf()分析if,while,for语句后的单语句,zhuan3() 分析定义语句并把定义的变量保存到de数组,zhuana() 分析 if 语句,zhuanw()分析 while 语句, zhuanf()分析for语句.
3. (1) 调用 sibegin()读到大括号里的内容 调用 zhuan2()处理大括号里的内容 循环分析所有内容 然后输出siprint()
(2) 循环调用
翻译成汇编 调用 huibian();根据四员式的功能直接反映成汇编语句
1. 以四员式的输出 结构体数组 shi 作为输入流
add()翻译加减语句 2.mul()翻乘除语句 3.cmp()翻译比较语句 4.and()翻译逻辑语句 5.mov()翻译付值语句 6.jmp()翻译跳转语句 7.put()翻译输出语句
思想
词法分析: 读文件内容做词法分析并转换成语法的输入流(data)
cifa ( ) 分割文件内容为字符串
读文件内容到数组st
循环开始,当前输入流首字符保存到ch,直到文件结尾符EOF
如果ch是分割符(\n \t 和空格) 继续。(如果是 \n ,line (保存当前行数) 加1保存空格到data
如果ch是分割符 ( ) { } ; , [ ] 保存到 data中
如果ch是字母或数字,读连续的所有数字或字符到str
如果ch是运算符,读连续的所有运算符到str
如果ch是单引号(如常量 ‘a’)读连续的字符直到下一个单引号保存到str
判断str是否为空,否:调用zhuanhuan(str) 转换str的内容到data。
如果ch不是结束符,读下一字符到ch。继续循环,返回到(2)
数组data置结束符。
zhuanhuan(char *s) 转换字符串s 为 文法分析符号,保存到data
读s 的第一个字符到ch ,判断ch是数字,转入函数shu(s),是正确的数字串 转换为文法分析字符到data,错误 输出错误字符
如果ch是字母,转入函数bianliang(s),是正确的字符串,转换为文法分析串到data。错误输出s
如果ch是运算符,转入函数suanfu(s),是正确的运算符串,
文档评论(0)