编译原理实验报告.doc

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验报告 姓名:陈家毫 班级:计科1202 学号:201231102099 实验一 词法分析程序 实验目的 构造Training语言的词法分析程序,程序要求能对输入的字符串流进行词法分析。在实验的过程中,学会应用单词分析的方法——NFA(非确定有穷自动机)和DFA(确定有穷自动机),加深对词法分析原理的理解。 实验内容 Training惯用的词法 下面是Training语言的关键字。 function if then while do endfunc 所有的关键字都是保留字,并且必须是小写。 下面是专用符号 = + -- * / = != = == ;()# 其他单词是标识符(id)和整型常数(num),通过下列正规定义。 Id=letter(letter|digit)* num=digit digit* letter=a |…|z|A|…|Z digit=0|…|9 小写和大写字母是有区别的。 空格由空白、换行符和制表符组成。空格一般用来分隔id、num、运算符和关键字,词法分析阶段通常被忽略。 各种单词符号对应的种别码如图所示 单词符号 种别码 单词符号 种别码 function 1 = 18 if 2 20 then 3 = 21 while 4 != 22 do 5 23 endfunc 6 = 24 letter(letter|digit)* 10 == 25 digit digit* 11 ; 26 + 13 ( 27 -- 14 ) 28 * 15 # 0 / 16 2.词法分析程序的功能 (1)输入为所给文法的源程序字符串。 (2)程序的输出形式为单词串的输出形式。 所输出的每一个单词,均按形如(syn,token和sum)的二元式编码。其中,syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。 算法设计基本思想 算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。 程序流程图 状态转换图 程序代码 #includestdio.h #includestring.h scaner(); char prog[80],token[8]; char ch; int syn,p,m,n,sum; char * rwtab[6]={function,if,then,while,do,endfunc}; int i=0,k,c,sumint,f; char fenshu[80],sum1[80]; double sumf=0,fudian; int shuzi(){ if(ch=0 ch=9) syn=80; else syn=-2; return syn;} main() {p=0; printf(\n please input string :\n); do{ scanf(%c,ch); prog[++p]=ch;} while(ch!=#); p=0; do { scaner(); switch(syn) { case 11:printf(\n(%d,%d),syn,sum);break; case -1:printf(\n error);break; case 80:printf(\n(%d,%f),syn,fudian);break; default:printf(\n(%d,%s),syn,token); } }while(syn!=0); } scaner() { for(n=0;n8;n++) token[n]=NULL;//if(1+2!=3) ch=prog[++p]; while(ch== || ch==\n) ch=prog[++p];//跳过空格 if(ch=a ch=z) { m=0; while(ch=a ch=z || ch=0 ch=9) { token[m++]=ch;//token[0]=f,m=1 ch=prog[++p]; } token[m]=\0; ch=prog[--p]; syn=10; for(n=0;n6;n++){ if(strcmp(token,rwtab[n])==0) { syn=n+1; break; } } } else if(ch

文档评论(0)

lxAPkYQojM + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档