编译 DO-WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)
DO-WHILE循环语句的翻译程序设计
(LR方法、输出三地址表示)
1.系统描述
1.1设计目的
通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。
1.2设计内容及步骤
对循环语句:DO〈赋值语句〉WHILE 〈表达式〉
按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。
(1)按给定的题目给出语法分析方法的思想及分析表设计。
(2)按给定的题目给出中间代码序列的结构设计。
(3)完成相应的词法分析、语法分析和语义分析程序设计。
(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。
2文法的描述
本程序所用的文法如下:
G[S]:
(1)S->do{E;}while(B) {if B.true goto B.true else goto B.false;}
(2)B->I1 rop I2 {B.type=bool;B.val=I1.val rop I2.val;}
(3)E->I1=I2 op I3 {I1.val=I2.val op I3.val;}
(4)I->id {I.val=id.val;}
注意:rop is < or >,op is +,-,*,/, id is any number or identifier
由上可知,非终结符B表示布尔表达式,E表示赋值表达式
3.语法分析方法描述及语法分析表设计
3.1语法分析方法描述
本实验采用LR分析方法对DO-WHILE语句进行语法分析。LR分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范过程。
一个LR分析器由3个部分组成:
总控程序,也可以称为驱动程序。对所有的LR分析器,总控程序是相同的。
分析表或分析函数。不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。
分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。
分析器的动作由栈顶状态和当前输入符号所决定。
LR分析器工作过程示意图如图所示:
其中SP为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。状态转换表内容按关系GOTO[Si,X]=Sj确定,改关系式是指当前栈顶状态为Si遇到当前文法符号为X 时应转向状态Sj。X为终结符或非终结符。
ACTION[Si,a]规定了栈顶状态为Sj时遇到输入符号c[i]应该执行的动作。动作有以下四种可能:
移进:当Sj=GOTO[Si,a]成立,则把Sj移入到文法符号栈。其中i,j表示状态号。
规约:当在栈顶形成句柄为b时,则用b归约为相应的非终结符A,即当文法中有A->b的产生式,而b的长度为r,则从状态栈和文法符号栈中自栈顶向下去掉r个符号。并把A移入文法符号栈内,再把满足Sj=GOTO[Si,A]的状态移进状态栈,其中Si为修改指针后的栈顶状态。
接受acc:当归约到文法符号栈中只剩下文法的开始符号S时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。
报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。
3.2语法分析表设计
3.2.1构造文法的DFA
I0:S’->.S
S->.do{E;}while(B)
I1:S’->S.
I2:S->do.{E;}while(B)
I3:S->do{.E;}while(B)
E->.I= I op I
I->.id
I4:S->do{E.;}while(B)
I5:E->I . =I op I
I6:I->id.
I7:S->do{E;.}while(B)
I8:E->I=.I op I
I->.id
I9:S->do{E;}.while(B)
I10:E->I = I. op I
I11:S->do{E;}while.(B)
I12:E->I=I op .I
I=.id
I13:S->do{E;}while(.B)
B->.I rop I
I->.id
I14:E->I=I op I.
I15:S->do{E;}while(B.)
I16:B->I .rop I
I17:S->do{E;}while(B).
I18:B->I rop .I
I19:B->IropI.
3.2.2然后写出LR分析表:
4.中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式的描述
在本程序中作用三地址码表示中间代码
赋值语句t1 := a op b,a:= b
条件转移if true goto Label
无条件转移goto Label
4.2中间代码序列的结构设计
本程序用标号来表示程序的跳转过程,示例如下
100 赋值语句
101赋值语句
102 条件跳转语句
103 无条件转移语句
…
5.编译系统的概要设计
本编译程序的结构图如下:
说明:源程序(do-while语句)通过控制台输入。然后通过Lex函数对输入的源程序进行分析后,将分析结果以二元组的方式输出到控制台。接下来通过调用语法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制导翻译,完成属性文法定义规定的相关语义动作。本编译程序最后完成的三地址码输出是通过中间文件间接输出到控制台上的。在执行Analyze函数的过程中,同时运用ofstream文件流将三地址码输出到一个ASCII码的txt类型文件中,最后从该文件中读出最终处理的三地址码输出至控制台。
6.详细的算法描述(流程图或伪代码)
6.1词法分析
词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。
词法分析检查的错误主要是挑出源程序中出现的非法符号。下面为本程序中所用来进行词法分析的伪代码:
输入字符;
If(字符是字母)
{
查找关键词表;
If(是关键字do或者while)识别关键词;
Else 判断为标识符;
}
Else if(字符是数字)获取整个数;
Else if(运算符)
{
If(是算术运算符)识别算术运算符;
Else 识别为关系运算符;
}
Else 标识为其他类型
以下附部分源码:
int Lex(char InStr[20][8],int InStrLen)
{//0关键字,1标识符2数字3界符4算符5其他char strsrc[BUFFURSIZE],strdst[8],ch;
int strcount=0,strLength,i=0;
cout<<"Please input the do-while statement:"< gets(strsrc); strLength=strlen(strsrc); cout< while(strcount { while(strsrc[strcount]==' ') strcount++; ch=strsrc[strcount]; if(Alpha(ch)) { i=0; do strdst[i++]=strsrc[strcount++]; while((Alpha(strsrc[strcount])||Digit(strsrc[strcount]))&&(strcount strdst[i]='\0'; if(!strcmp(strdst,"while")) cout< else cout< for(int k=0;strdst[k]!='\0';k++) { InStr[InStrLen][k]=strdst[k]; } InStr[InStrLen++][k]='\0'; } else if(Digit(ch)) { i=0; do strdst[i++]=strsrc[strcount++]; while(Digit(strsrc[strcount])&&(strcount strdst[i]='\0'; cout< for(int k=0;strdst[k]!='\0';k++) { InStr[InStrLen][k]=strdst[k]; } InStr[InStrLen++][k]='\0'; } else if(Oper(ch)) { i=0;strdst[i]=ch;strdst[i+1]='\0'; if(!strcmp(strdst,";")||!strcmp(strdst,"(")||!strcmp(strdst,")")||!strcmp(strdst,"{")||!st rcmp(strdst,"}")) cout< else cout< for(int k=0;strdst[k]!='\0';k++) { InStr[InStrLen][k]=strdst[k]; } InStr[InStrLen++][k]='\0'; strcount++; } else { cout< isillegal=1; cout<<"isillegal="< cout<<"not while statement "< strcount++; } } InStr[InStrLen++][0]='#'; cout<<"inputed string"< for(int j=0;j cout<<" "< cout<<"grammer analysis"<<'\n'; return InStrLen; } 6.2语法分析 流程图如下,具本处理过程,请参见本文档3.1小节 此处附上语法语义分析函数 void Analyze(State state) { int row=0,col=0,numchange=0; cout<<" Procedure"< cout.setf(ios::left); cout<<"step"<<" "< strcpy(next,state.InStr[state.CurInstr]); ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; ofstream outfile("do_while.txt"); while(strcmp(state.stkSymbol[state.CurSymbol],"S")!=0&&numchange!=20) { if(numchange==0){isillegal=1;break;} numchange=Action(state,numchange,outfile); } if(isillegal==0) { cout< state.showState(); cout< } cout<<"processing semantic analysis"< } 关键的状态转移函数ACTION和GOTO int Action(State &state,int actionnum,ofstream &outfile) { int row=0,col=0,numchange=0; int choice=0; int ct=100; int m=0; if(actionnum>=1&&actionnum<=18)choice=1; else choice =actionnum; switch(choice) { case 0: { isillegal=1; cout<<"isillegal="< break; } case 1://移进项目 { cout< state.showState(); cout< state.CurState++;state.stkState[state.CurState]=actionnum; state.CurSymbol++; strcpy(state.stkSymbol[state.CurSymbol],state.InStr[state.CurInstr]); strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; break; } case 20://接收 { cout< state.showState(); cout< break; } case 21://r1 S-->while(B){E;} { cout< state.showState(); cout< for(int i=9;i>0;i--) {state.stkState[state.CurState--]=0;} for(i=9-1;i>=0;i--) { strcpy(B[i],state.stkSymbol[state.CurSymbol]); strcpy(state.stkSymbol[state.CurSymbol--],""); } outfile<<"B.false: "<<'\n'; state.CurSymbol++; strcpy(state.stkSymbol[state.CurSymbol],"S"); //B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; numchange=Goto(state,numchange); break; } case 22://r2 B-->IropI { cnt=0; cout< cout< for(int i=3;i>0;i--) {state.stkState[state.CurState--]=0;} for(i=3-1;i>=0;i--) { strcpy(B[i],state.stkSymbol[state.CurSymbol]); strcpy(state.stkSymbol[state.CurSymbol--],""); } outfile<<"102 t1:="< outfile<<"103 if t1.val=true"<<" goto 100"< outfile<<"104 goto 105"< state.CurSymbol++; strcpy(state.stkSymbol[state.CurSymbol],"B"); //归约B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; numchange=Goto(state,numchange);break; } case 23://r3 E-->I=IopI { cnt=0; cout< state.showState(); cout< for(int i=5;i>0;i--) {state.stkState[state.CurState--]=0;} for(i=5-1;i>=0;i--) { strcpy(E[i],state.stkSymbol[state.CurSymbol]); strcpy(state.stkSymbol[state.CurSymbol--],""); } outfile<<"100 "<<"t1:="< outfile<<"101 "< state.CurSymbol++; strcpy(state.stkSymbol[state.CurSymbol],"E"); strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; numchange=Goto(state,numchange);break; } case 24://r4归约I-->id { cout< state.showState(); cout< state.stkState[state.CurState--]=0; strcpy(I[cnt++],state.stkSymbol[state.CurSymbol]);//{I.value=id.value} strcpy(state.stkSymbol[state.CurSymbol],"I"); //归约I-->id strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); numchange=table[row][col]; numchange=Goto(state,numchange);break; } } return numchange; } int Goto(State &state,int gotonum) { int row=0,col=0,numchange=0; cout< state.CurState++; state.stkState[state.CurState]=gotonum; strcpy(next,state.InStr[state.CurInstr]); ropOrOp(next); row=state.stkState[state.CurState]; col=Index(next); return table[row][col]; } 7.软件的测试方法和测试结果 (1)运行程序,显示如下程序界面 (2)按照提示输入合法的do-while语句 Do{a=b+c;}while(a (3)按enter确定输入完毕,得到词法分析结果,显示如下: 并且最后一行提示了经过词法分析后合法的待输入串在栈中的存储情况。 (4)继续确定,可以看见输入的句子的按LR方法的详细处理过程。结果显示如下: 由此可以看见在用LR方法识别d0-while句子的时候,状态栈,符号栈以及待输入串的详细变化情况。(说明, 其中21,22,23,24分别表示用第1、2、3、4个产生式进行归约。) (5)继续执行程序,最终出现语义分析结果 8.研制报告 8.1研制过程 本次实验是对do-while语句运用LR分析法进行语法分析,分析的过程中要求运用属性文法和语法制导翻译的相关知识来有效完成对一个合法的do-while 语的语义分析。 做实验如果有一个比较详细的安排和计划,就会使实验进程井井有条。在实验之始,按照实验说明书的要求,对实验进行了模块划分。首先大致分为三个部分,包括词法分析,语法分析和语义分析。因为以前做过词法分析和语法分析的相关实验,所以这部分比较容易。于是精力大部分放在第三个部分语义分析上。首先,根据自己拟定文法,构造出正确的LR分析表,文法虽然只有四个产生式,但经过分析,却产生了多达20个状态。完成了LR分析,接着是确定给定文法的属性文法,以便在语法制导翻译中,根据所给的语义动作,有效完成三地址码的输出。 确定了程序的基本结构和流程,接下来就是编制程序了。模块化的功能函数降低了编制程序的难度,经过不断修改和调试程序,终于成功完成了该实验。 8.2设计评价 本次实验设计能有效识别合法的do-while 语句。根据给定的文法,只要是形如do{E;}while(B)的句子(其中E为赋值表达式,B为布尔表达式),都可以正确得出其LR分析的详细过程,并且做出有效的三地址输出。 在本次实验中,对于数据结构有特殊的要求,需要用到具有先进后出性质的栈结构,但是为了方便本次实验的处理,采用一维数组来模拟栈结构。同时,将状态栈,符号栈,和待输入串放在一个类中,以便可以声明对象直接进行处理。 虽然本次实验成功完成了对do-while语句的语法制导翻译过程,但是还是存在一些缺点。比如,在词法分析过程中,没有对错误的语句输入进行判断,因此只有输入正确的do-while语句,才能完成程序执行。 8.3心得与体会 通过这次为期一周的实验,完成了对do-while语句的翻译过程。这次实验对这半年来所学习的编译原理的相关知识进行了有效应用,尤其是对比较抽象的词法分析,语法分析,语义分析,语法制导翻译等有了更深层次的理解。正因为理论联系实践,我才对编译原理这门课程有了更好的掌握。虽然实验成功了很有成就感,但也发现了自己的一些不足。比如对一些基础知识的理解还不够透彻,对所学的算法还不能够熟练应用。 不管这次实验中有多少跌跌撞撞,但终归是受益匪浅。学习就是不断进步的过程,经过这次的课程设计,我的编程能力和逻辑分析能力得到了锻炼。 9.参考文献 [1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005年2月 参考书: [1]何炎祥.编译原理(第二版).华中科技大学出版社.2005年8月 [2]胡伦骏.编译原理(第2版).电子工业出版社.2005年2月 [3]胡元义等.编译原理实践教程.西安电子科技大学出版社.2002年1月[4]钱能著,C++程序设计教程,北京:清华大学出版社,2002.7 课程名称:信息论与编码 课程设计题目:循环码的编码和译码程序设计指导教师: 系别:专业: 学号:姓名: 合作者 完成时间: 成绩:评阅人: 一、实验目的: 1、通过实验了解循环码的工作原理。 2、深刻理解RS 码构造、RS 编译码等相关概念和算法。 二、实验原理 1、RS 循环码编译码原理与特点 设C 使某 线性分组码的码字集合,如果对任C c c c C n n ∈=--),,,(021 ,它的循环 移位),,,(1032)1(---=n n n c c c c C 也属于C ,则称该 码为循环码。 该码在结构上有另外的限制,即一个码字任意循环移位的结果仍是一个有效码字。其特点是:(1)可以用反馈移位寄存器很容易实现编码和伴随式的计算;(2)由于循环码有很多固有的代数结构,从而可以找到各种简单使用的译码办法。 如果一个 线性码具有以下的属性,则称为循环码:如果n 元组 },,,{110-=n c c c c 是子空间S 的一个码字,则经过循环移位得到的},,,{201)1(--=n n c c c c 也 同样是S 中的一个码字;或者,一般来说,经过j 次循环移位后得到的 },,,,,,,{11011)(---+--=j n n j n j n j c c c c c c c 也是S 中的一个码字。 RS 码的编码系统是建立在比特组基础上的,即字节,而不是单个的0和1,因此它是非二进制BCH 码,这使得它处理突发错误的能力特别强。 码长:12-=m n 信息段:t n k 2-= (t 为纠错符号数) 监督段:k n t -=2 最小码段:12+=t d 最小距离为d 的本原RS 码的生成多项式为:g(x)=(x-α)(x -α2)(x -α3)…(x -αd -2) 信息元多项式为::m(x)=m0+m1x+m2x2+…+mk -1xk-1 循环码特点有: 1)循环码是线性分组码的一种,所以它具有线性分组的码的一般特性,且具有循环性,纠错能力强。 2)循环码是一种无权码,循环码编排的特点为相邻的两个数码之间符合卡诺中的邻接条件,即相邻数码间只有一位码元不同,因此它具有一个很好的优点是它满足邻接条件,没有瞬时错误(在数码变换过程中,在速度上会有快有慢,中间经过其他一些数码形式,即为瞬时错误)。 3)码字的循环特性,循环码中任一许用码经过牡环移位后,所得到的码组仍然是许用码组。 课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日 目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17) FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程 ****************** 实践教学 ******************* 兰州理工大学 计算机与通信学院 2014年秋季学期 计算机通信课程设计 题目:(7,3)循环码编译码软件设计 专业班级: 姓名: 学号: 指导教师: 成绩: 摘要 随着计算机通信的日益发展,传输数据的场合越来越多。串行数据的差错检验是保证数据传输正确的必要手段,而循环码是差错码中最常用的一种编码。 循环码是线性分组码中最重要的一种子类,它除了具有分组码的线性外,还具有循环性,其码字结构一般用符号(n,k)表示,其中,n是该码组中的码元数,k是信息码元位数,r=n-k是监督码元位数。循环码具有许多特殊的代数性质,这些性质有助于按照要求的纠错能力系统地构造这类码,能简化译码算法,并且目前发现的大部分线性码与循环码有密切关系。已有循环码编译码系统大多以标准逻辑器件(如中小规模TTL系列、CMOS系列)按传统数字系统设计方法设计而成,其主要缺点是逻辑规模小、功耗大、可靠性低。随着大规模、超大规模集成电路的发展,以及电子设计自动化水平的提高,这种制约正在被逐渐消除。 本文通过C 语言平台运行所编写的程序,观察了在输入信息码情况下输出对应的编码结果以及相反的译码功能。通过多组的对比验证了该(7,4)循环码的编译码程序的正确性。最后,在程序运行的过程中进步分析循环码的编译码原理,并通过比较仿真模型与理论计算的性能,证明了仿真模型的可行性。 关键词:循环码;编码;译码;程序仿真 目录 前言 (1) 1、目的及意义 (2) 2、设计原理 (3) 2.1循环码的介绍 (3) 2.1.1循环码的定义 (3) 2.1.2循环码的特点 (3) 2.1.3循环码的多项式表示 (4) 2.1.4(n,k)循环码的生成多项式 (4) 2.1.5循环码的生成矩阵和一致校验矩阵 (6) 2.2循环码编码原理 (8) 2.2.1多项式除法电路 (8) 2.3循环码译码原理 (9) 3、设计结果及分析 (11) 3.1程序运行结果 (11) 3.2运行结果理论分析 (14) 3.3软件可行性分析 (15) 4、总结 (16) 附录 (17) 参考文献 (22) 课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日 DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述 第5章流程控制语句 JavaScript程序是由若干个语句组成的,每一个语句以分号作为结束符。语句可以很简单,也可以很复杂。其中,改变程序正常流程的语句称为控制语句。流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中基本却又非常关键的部分。流程控制语句可以把单个语句组合成有意义的、能完成一定功能的小逻辑模块。本章内容包括: ?顺序控制语句; ?选择控制语句; ?循环控制语句; ?其他流程控制语句。 通过本章学习,读者应该对几种流程控制语句有很深的理解,并可以利用这几种流程控制语句编写简单的程序。 5.1 顺序控制语句 JavaScript语言中,顺序控制语句是最简单的语句。其有如下特点:所有语句按照一定的顺序执行,每一条语句只执行一遍,不重复执行,也没有语句不执行。JavaScript语言中的顺序控制语句包括表达式语句,函数调用语句,空语句和复合语句等。 5.1.1 表达式语句 表达式后面跟一个分号就构成了一个表达式语句。最常见的表达式语句为赋值语句。赋值语句是在一个赋值表达式后跟一个分号形成的,程序中很多计算都由赋值语句完成。 【示例5-1】演示几个表达式语句。其代码如下所示。 var m=4; //把4赋给变量m var n=”hello world”; //把字符串hello world赋值给n i=m+n; //把变量m和n的和赋值给变量i 实际上,任何表达式都可以加上分号而成为语句。 【示例5-2】变量i自增1。 i++; //变量i的值加1 注意:有些语句写法虽然是合法的,但是由于其没有保留计算结果,因而并没有实际意义。如以下代码: a-b; i++-1; 课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日 循环码编译码matlab程序 循环码编码程序 function [ C ] = cyclic_encoder( Si ) %C为循环编码的输出编码结果 %对x^8+1进行模2因式分解得到:x^8+1=(x^3+x^2+x+1)*(x^5+x^4+x+1) y=size(Si,2);%y表示Si的列数,即输入码元的个数 M=ceil(y/5);%将信息码元分成M帧,一帧5个信息码元 n=8;%循环编码的一帧码长 k=5;%信息位的个数 r=n-k;%监督位的个数 gx=[1,1,1,1];%(8,5)循环码的生成多项式g(x)=x^3+x^2+x+1 Ai=zeros(1,8*M);%Ai用来存放所输入的码元经过循环编码后的码字 Axi=zeros(1,8);%Axi用来表示循环编码后的一帧的编码输出码字 mi=zeros(1,5);%mi用来存放每一帧的信息码元 for i=1:M for j=1:5 mi(j)=Si(j+(i-1)*5); end Axi(4:8)=mi(1:5); Axi=circshift(Axi',-r)';%实现(x^(n-k))*m(x),其中m(x)的系数由mi决定 [qx,rx]=deconv(Axi,gx);%实现((x^(n-k))*m(x))/g(x),得到商q(x)和余数r(x) Axi=Axi+rx;%实现Axi(x)=Axi(x)+r(x),得到的Axi就是循环编码的编码输出码字 Ai(8*i-4:8*i)=Axi(1:5); Ai(8*i-7:8*i-5)=Axi(6:8); end %for循环是为了实现模2相加,使循环编码的输出码字Ai中只有0,1 for i=1:8*M if rem(abs(Ai(i)),2)==0 Ai(i)=0; else Ai(i)=1; end end C=Ai;%循环编码的输出码字C=Ai end 程序流程控制语句:选择语句 https://www.360docs.net/doc/4b12109046.html,网站制作 2011年9月1日 Java语言中的程序流程控制语句有三种:顺序结构、选择结构和循环结构。其中顺序结构最简单,程序依次执行各条语句。Java的每条语句一般以分号(“;”)作为结束标志。所以本章重点讲解选择结构和循环结构。 1、选择语句 在程序设计时,经常需要使用选择结构在程序中完成逻辑判断和选择功能,这就需要使用到选择语句。Java中的选择语句包括if语句、if-else语句和switch语句。选择语句用来控制选择结构,对选择条件进行判断,并根据判断结果选择要执行的程序语句,改变程序执行流程。 2、if选择语句 在实际生活中,经常会需要做一些逻辑判断,并根据逻辑判断结果做出选择。例如,当一个男孩子向一个非常理智的女孩子求婚时,这个女孩子思考的逻辑可能是这样的: 如果你有100万 那么,我就嫁给你! 在这里,女孩子嫁给男孩子这个过程的实施,必须以“你有一百万”为前提。只有逻辑判断“你有一百万”这一前提条件为真时,“那么,我就嫁给你!”这个行为才能得到执行。在生活当中,类似这样的情形是很常见的。 相应地,在Java程序设计语言中,也有相应的条件语句来完成类似的逻辑判断和有选择地执行这样的功能,这就是if语句。if语句的语法格式如下: if(条件表达式) 语句 或者 if(条件表达式){ 一条或多条语句 } if语句执行的过程如下: 1.对if后面括号里的条件表达式进行判断。 2.如果条件表达式的值为true,就执行表达式后面的语 句或后面大括号里的多条语句。 3.如果条件表达式的值为false,则跳过if语句,执行 下一条语句。 WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将基于MATLAB的循环码实验报告
WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)
FOR循环语句的翻译程序设计
7,3循环码
DO-WHILE循环语句的翻译程序设计
JavaScript流程控制语句
for循环语句的翻译
循环码编译码matlab程序
程序流程控制语句
WHILE循环语句的翻译程序设计(简单优先法、输出四元式)