WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)

合集下载

编译原理while语句的翻译

编译原理while语句的翻译

课程设计题目WHILE循环语句的翻译程序设计(简单优先法、输出四元式)学院计算机科学与技术学院专业计算机科学与技术专业班级1003班姓名刘颖指导教师李玉强2013 年 1 月11 日目录任务书 (2)1.系统描述 (3)2.文法及属性文法的描述 (3)3.语法分析方法的描述及分析表设计 (3)3.1.语法分析方法的描述 (3)3.2.优先关系表 (4)4.1.中间代码形式的描述 (4)4.2.中间代码序列的结构设计 (4)5.编译系统的概要设计 (4)6.详细的算法描述(流程图或伪代码) (5)6.1.主函数伪代码 (5)6.2.词法分析总控流程图 (5)6.3.语法分析 (5)7.源程序 (6)7.1.优先关系 (6)7.2.词法分析 (6)7.3.语法分析 (10)7.4.归约函数 (10)8.软件的测试方法和测试结果 (11)8.1.输入 (11)8.2.词法分析结果 (11)8.3.语法分析结果 (12)9.研制报告 (12)10.参考文献 (13)11.开发工具 (13)评分表 (14)课程设计任务书学生姓名:刘颖专业班级:计算机1003班指导教师:李玉强工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(简单优先法、输出四元式)初始条件:理论:学完编译原理课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

WHILE循环语句的翻译程序设计(简单优先法,三地址输出)

WHILE循环语句的翻译程序设计(简单优先法,三地址输出)

目录1 问题域描述 (3)2 文法及属性文法的描述 (3)2.1 WHILE循环语句的文法 (3)2.2 WHILE循环语句的属性文法 (4)3 语法分析方法及中间代码形式的描述 (4)3.1语法分析方法 (4)3.2中间代码形式描述 (6)4 编译系统的概要设计 (7)4.1词法分析 (7)4.2语法制导翻译 (8)5 详细的算法描述 (8)5.1 文法设计 (8)5.2 算法描述 (8)5.3 源程序代码 (9)6 软件的调试过程和结果测试 (19)6.1调试过程 (19)6.2结果测试 (19)7 使用说明 (20)8 课设总结 (20)9 参考文献 (22)WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1 问题域描述while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1)用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。

(2)求能正确进行词法分析,语法分析,并能正确的输出预期结果。

(3)根据指定的文法,判定程序的正确性。

本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。

通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。

while循环语句的格式为:while(P){do A},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。

while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。

该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。

通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。

WHILE循环语句的翻译程序设计

WHILE循环语句的翻译程序设计

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1 系统描述按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。

该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。

词法分析器应能识别关键字,标示符,常量,操作符等。

该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。

通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。

该程序的语义分析器就是对分析结果进行输出,要求输出结果是三地址形式的。

2 文法及属性文法的描述2.1文法描述<while语句> ::= while (<条件表达式>) (<赋值语句> | <while语句>)<条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数>)<标识符> ::= <字母> (<字母>|<数字>)<条件运算符> ::= > | < | =<无符号整数> ::= <数字>(<数字>)<赋值语句> ::= <标识符>=(<标识符> | <数字>) <算术运算符> (<标识符> | <数字>)<算术运算符> ::= + | - | * | /<赋值语句> ::= <标识符>=<标识符> | <数字>2.2递归文法while语句文法:S -> while (B) S | i=EB -> E relop Erelop -> < | = | >E -> E+E | E-E | E*E | E/E | (E) | i | n在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得到如下的递归文法:S -> while (B) S | i=EB -> E relop Erelop -> < | = | >E -> (E)F | iF | nFF -> +EF | -EF | *EF | /EF | ε2.3属性文法的描述产生式属性文法S -> while (B) S1 S.begin:=newlabel;S.next:=newlabel;B.true:=newlabel;B.false:=S.next;S1.next:=S.begin;S.code:=gen(S.begin, ‘:’) || B.code ||gen(S.true, ‘:’) ||S1.code || gen(‘goto’,S.begin) || gen(B.false, ‘:’)|| gen(‘goto Lnext’);B -> E1 relop E2 B.place:=newlabel;B.code:=E1.code || relop.code ||E2.code ||gen(B.place ‘:=’, E1.place , relop. place , E2.place); relop -> < | = | > relop.place:=newlabel;relop.code:=gen(‘<’)||gen(‘=’)||gen(‘>’);E -> (E1)F E.place:=newlabel;E.code:=E1.code ||F.code ||gen(E.place ‘:=’ ,‘(’, E1.place , ‘)’, F.place);E -> iF E.palce:=newlabel;E.code:=i.code ||F.code ||gen(E.palce ‘:=’ ,i.place , F.place);E -> nF E.place:=newlabel;E.code:=n.code ||F.code ||gen(E.place ‘:=’ , n.place , F.place);F -> +EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= + ’, E.place , F1.place);F -> -EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= - ’, E.place , F1.place);F -> *EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= * ’, E.place , F1.place);F -> /EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= / ’, E.place , F1.place);F -> ε F.place:=newlabel;F.code:=gen(F.code‘:= ε’);图1 属性文法3 语法分析方法描述按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。

DO WHILE循环语句的翻译 递归下降法 输出三地址

DO WHILE循环语句的翻译 递归下降法 输出三地址

DO-WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1.系统描述1.1目的通过设计,编制,调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的此法检查和分析。

1.2设计内容及步骤对DO 语句WHILE 条件(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

1.3 初始条件理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果有计算机可以在其上进行设计。

1.4 开发平台Windows环境下使用Visual C++2.文法及属性文法的描述2.1 DO-WHILE循环语句的文法文法G(S)如下:S->do{A}while(P);A->id=E;E->TE'E'->+TE' | -TE' | eT->FT'T'->*FT' | /FT' | eF->(E) | idP->E rop idrop-> > | < | >= | <= | != | ==2.2 DO-WHILE循环语句的属性文法3.语法分析方法描述及语法分析表设计3.1语法分析方法3.11递归下降法递归下降法是比较简单直观易于构造的一种语法分析方法。

递归下降法的主要思想是:对每个非终结符按其产生式结构写出相应语法分析递归过程,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选时能够按LL(1)形式可唯一确定选择某个候选式进行推导。

因为文法递归相应子程序也递归,子程序的结构与产生式结构几乎一致。

(完整word版)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

(完整word版)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。

PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

直到最后栈内只剩下开始符号,输入串读到“#”为止。

此时识别正确。

可分点描述如下:(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2)、规定句柄内各相邻符号之间具有相同的优先级;(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。

3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。

缺点:适用范围小,分析表尺寸太大。

二、源代码实现:#include<iostream>#define MAX 35#include<list>#include<string>#include<fstream>using namespace std;#define TABLE_LEN 8#define STR_LEN 256int zhlen;char sTable[TABLE_LEN+1] = {"+-*/()i#"};//顺序索引int ShipTable[TABLE_LEN][TABLE_LEN] = //优先表{{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{-1,-1,-1,-1,-1, 0,-1,-2},{ 1, 1, 1, 1,-2, 1,-2, 1},{ 1, 1, 1, 1,-2, 1,-2, 1},{-1,-1,-1,-1,-1,-2,-1, 0}};char X,a;char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0", "*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};char stack[MAX];char queue[MAX];int sp,front;intM[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8,8},{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},};int f=0; int count=0;int c=0;char arr_i[MAX];char var[MAX]; //表格管理int td[MAX];int t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arr[MAX][4];//存放待输出的四元式//char keyword[2][7]={"do\0","while\0"};bool IsCharInStr(char c,char s[]){for(int i=0;s[i]!='\0';i++){if(s[i]==c)return true;}return false;}int GetIndex(char s[],char c){for(int i=0;s[i]!='\0';i++){if(c==s[i])return i;}return -1;}//string GetSubString(char s[],int from,int to){string st;for(int i=from;i<to;i++){st+=s[i];}return st;}/*******************************************翻译赋值表达式********************************************/void translatefuzhi(char *sInput){//栈结构的初始化char Stack[STR_LEN]={0};int index = 0;int top = 1;Stack[0] = '#';list<char> rPolish;list<string> Num;int begin=0;while(sInput[begin]!='='){if(IsCharInStr(sInput[begin],sTable)){cout<<"Equal expression is illegal!"<<endl;return ;}begin++;}Num.push_back(GetSubString(sInput,0,begin));int now = begin+1;int before = begin;rPolish.push_back('i');while(sInput[now]!='\0'){if(IsCharInStr(sInput[now],sTable)){char temp[3]={0};if(now-before>1){temp[0] = 'i';temp[1] = sInput[now];Num.push_back(GetSubString(sInput,before+1,now));}else{temp[0] = sInput[now];}int i=0;while(temp[i]!=0){int left = GetIndex(sTable,Stack[index]);int right = GetIndex(sTable,temp[i]);switch(ShipTable[left][right]){case -1://移入Stack[top++] = temp[i];index = top-1;i++;break;case 0://脱括号if(Stack[index]=='('){Stack[top++] = ')';Stack[index] = 'E';top = index+1;index--;}else//规约{if(top!=2){return;}rPolish.push_back('=');list<char>::iterator iter;list<string>::iterator siter=Num.begin();string fuzhi[256];int d=0,m;for(iter=rPolish.begin();iter!=rPolish.end();iter++){if(*iter=='i'){fuzhi[d++]=*siter;siter++;}else{fuzhi[d++]=*iter;}}m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d<m;d++)cout<<"("<<fuzhi[d]<<","<<op1<<","<<op2<<","<<"T"<<xiabiao<<")"<<endl;fuzhi[d] = "T";fuzhi[d]+=(xiabiao+'0');xiabiao++;}//cout<<fuzhi[d];}return;}i++;break;case 1://归约if(Stack[index]=='i'){rPolish.push_back('i');Stack[index] = 'E';index--;}else{rPolish.push_back(Stack[index]);Stack[index-1] = 'E';top = index;index-=2;}break;default:return;}}before=now;}now++;}}int len(char str[]){int i=0;while(str[i]!='\0')i++;return i;}int index(char ch,char str[]){int i=0;while(str[i]!='\0'){if(ch!=str[i])i++;else break;}if(str[i]=='\0')return -1;return i;}void err(int n){if(n==1)cout<<"字符不匹配"<<endl;else if(n==2)cout<<"字符没有出现在产生式中"<<endl;else if(n==3)cout<<"没有找到合适的¨选产式"<<endl;else cout<<"该句子是文法语言的句子"<<endl;}void print(){cout<<"(";if(count<10)cout<<'0';cout<<count<<")";int i;for(i=0;i<=sp;i++)cout<<stack[i];for(;i<=20;i++)cout<<" ";for(i=0;i<front;i++)cout<<" ";for(;queue[i]!='#';i++)cout<<queue[i];cout<<queue[i];for(;i<=20;i++)cout<<" ";}void semantic(){if(VT[opr]=='='){arr[d][0]='=';arr[d][1]=arr_i[opd];arr[d][2]=id;arr[d][3]='--';id++;} else if(opr==-2){arr[d][0]='=';arr[d][1]=id-1;arr[d][2]=arr_i[opd];arr[d][3]='--';}else {arr[d][0]=VT[opr];arr[d][1]=arr_i[opd];arr[d][2]=id;if(VT[opr]!='<'&&VT[opr]!='>')arr[d][3]=id-1;else arr[d][3]=id+1;id++;}d++;}void syntax(){//语法分析int n;count++;print();X=stack[sp];a=queue[front];if(X=='#'&&a=='#')f=4;if(X<'A'||X>'Z'){if(X==a){sp--;front++;if(a!='i'){if(a!='d'&&a!='w'&&a!=';'&&a!='#'){opr=index(a,VT);semantic();}else if(a==';'||a=='w'||a=='#'){opr=-2;semantic();}cout<<'\t'<<'\''<<a<<"'匹配"<<endl;}else {opd=c;cout<<'\t'<<'\''<<arr_i[c++]<<"'匹配"<<endl;}}else f=1;}else {int tx=index(X,VN);int ta=index(a,VT);n=M[tx][ta];td[t++]=M[tx][ta];if(ta==-1){f=2;cout<<a<<endl;}else if(n==-1)f=3;else {sp--;cout<<'\t'<<X<<"->";if(len(p[n])!=0){for(inti=len(p[n])-1;i>=0;i--){stack[++sp]=p[n][i];cout<<p[n][len(p[n])-1-i];}cout<<endl;}else cout<<"空串"<<endl;}}if(f==0)syntax();else {td[t]='-1';err(f);}}void lexical(){ //词法分析int i,j,d;char ch;j=d=0;for(i=0;var[i]!='#';i++){ch=var[i];if(ch=='d'&&var[i+1]=='o'){cout<<"do"<<'\t'<<"keword"<<endl;queue[j++]='d';i+=1;}else if(ch=='w'){ch=var[i+1];if(ch=='h'){ch=var[i+2];if(ch=='i'){ch=var[i+3];if(ch=='l'){ch=var[i+4];if(ch=='e'){ch=var[i+5];}}}}cout<<"while"<<'\t'<<"keyword"<<endl;queue[j++]='w';i+=4;}else if(index(ch,VT)<=0){if(ch!='{'&&ch!='}'&&ch!='('&&ch!=')'){cout<<ch<<'\t'<<"variable:i["<<d++<<"]"<< endl;arr_i[d-1]=ch;queue[j++]='i';}else cout<<ch<<'\t'<<"bound"<<endl;}else if(index(ch,VT)>0){cout<<ch<<'\t'<<"operator"<<endl;queue[j++]=ch;} }queue[j]='#';for(i=0;queue[i]!='#';i++)cout<<queue[i];cout<<endl;}int main(){int i=0,j=0;int len,length;char temp;char S='K';sp=front=0;stack[0]='#';sp++;stack[1]='K';cout<<" ****************************"<<endl;cout<<" * DO-WHILE循环语句*"<<endl;cout<<" * (简单优先法输出四元式) *"<<endl;cout<<" ****************************"<<endl;ifstream table;table.open("dowhile.txt");if(!table){cout<<"error!";}table.seekg(0,ios::end);length = table.tellg();table.seekg(0,ios::beg);while(length!=table.tellg()){table.read((char*)&temp,1);var[i]=temp;i++;if(var[i]==' ')i--;if(var[i]=='#')break;}table.close();len=i;var[i]='\0';cout<<"词法分析"<<endl;lexical();char fuzhi[20];int flag1,fuzhilen;int s=0; for(i=0;i<len;i++){if(var[i]==';'){flag1=i;}}fuzhilen=flag1-2;for(i=3;i<flag1;i++){fuzhi[s++]=var[i];}fuzhi[s]='#';char shuru;char zh[100];int kaishi=0; zh[0]='d';for(kaishi=1;kaishi<s+1;kaishi++){zh[kaishi]=fuzhi[kaishi-1];}zh[kaishi++]=';';zh[kaishi++]='W';for(i=flag1+8;i<len;i++){if(var[i]=='}')break;else{zh[kaishi++]=var[i];}}zh[kaishi++]='#';zhlen=kaishi;cout<<"输出四元式"<<endl;cout<<"do"<<endl;translatefuzhi(fuzhi);cout<<"("<<var[flag1+9]<<","<<var[flag1+8]<<","<<var[flag1+10]<<","<<"T2"<<") "<<endl;cout<<"if T2=true goto T0"<<endl;return 0;}三、测试结果:词法分析部分:输出四元式:四、课程小结:这次编译原理课程设计的题目是用简单优先分析法进行DO-WHILE循环语句的语法分析,并输出四元式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如果栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

WHILE循环语句的翻译程序设计.

WHILE循环语句的翻译程序设计.

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1 系统描述按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。

该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。

词法分析器应能识别关键字,标示符,常量,操作符等。

该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。

通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。

该程序的语义分析器就是对分析结果进行输出,要求输出结果是三地址形式的。

2 文法及属性文法的描述2.1文法描述语句 > ::= while (< 条件表达式 > (< 赋值语句 > | 语句 ><条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数><标识符> ::= <字母> (<字母>|<数字><条件运算符> ::= > | < | =<无符号整数> ::= <数字>(<数字><赋值语句> ::= <标识符>=(<标识符> | <数字> <算术运算符> (<标识符> | <数字><算术运算符> ::= + | - | * | /<赋值语句> ::= <标识符>=<标识符> | <数字>2.2递归文法while语句文法:S -> while (B S | i=EB -> E relop Erelop -> < | = | >E -> E+E | E-E | E*E | E/E | (E | i | n在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得到如下的递归文法:S -> while (B S | i=EB -> E relop Erelop -> < | = | >E -> (EF | iF | nFF -> +EF | -EF | *EF | /EF | ε2.3属性文法的描述产生式属性文法S -> while (B S1S.begin:=newlabel;S.next:=newlabel;B.true:=newlabel;B.false:=S.next;S1.next:=S.begin;S.code:=gen(S.begin, ‘:’ || B.code||gen(S.true, ‘:’ ||S1.code || gen(‘goto’,S.begin ||gen(B.false, ‘:’|| gen(‘goto Lnext’;B -> E1 relop E2 B.place:=newlabel;B.code:=E1.code || relop.code ||E2.code ||gen(B.place ‘:=’ , E1.place , r elop.place , E2.place;relop -> < | =relop.place:=newlabel;| >relop.code:=gen(‘<’||gen(‘=’||gen(‘>’;E -> (E1F E.place:=newlabel;E.code:=E1.code ||F.code ||gen(E.place ‘:=’ ,‘(’, E1.place , ‘’, F.place;E -> iF E.palce:=newlabel;E.code:=i.code ||F.code ||gen(E.palce ‘:=’ ,i.place , F.place;E -> nF E.place:=newlabel;E.code:=n.code ||F.code ||gen(E.place ‘:=’ , n.place , F.place;F -> +EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= + ’, E.place , F1.place;F -> -EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= - ’, E.place , F1.place;F -> *EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= * ’, E.place , F1.place;F -> /EF1 F.place:=newlabel;F.code:=E.code || F1.code ||gen(F.place‘:= / ’, E.place , F1.place;F -> ε F.place:=newlabel;F.code:=gen(F.code‘:= ε’;图1 属性文法3 语法分析方法描述按照递归下降分析技术,递归下降识别程序是由一组子程序组成,每个子程序对应于一个非终结符号。

while循环的解释

while循环的解释

while循环的解释
嘿,朋友!你知道什么是 while 循环吗?这玩意儿就像是一场永不
停歇的冒险!比如说,你想象一下,你在一个超级大的迷宫里,只要
你还没找到出口,你就得一直走啊走(这就好比 while 循环的条件没满足,就一直执行里面的代码)。

咱就拿一个简单的例子来说吧。

假设你想让电脑一直给你报数,直
到报到10 为止。

那你就可以用while 循环来实现呀!代码就像是这样:int i = 1; while (i <= 10) { System.out.println(i); i++; } 看到没,只要 i 还
小于等于 10,它就会不停地执行里面的输出 i 和让 i 加 1 的操作,这不就跟在迷宫里一直找路一样嘛!
哎呀呀,while 循环可太有用啦!它能让电脑像个不知疲倦的小机
器人一样,按照我们设定的规则一直工作下去。

你想想看,如果没有while 循环,那我们得写多少重复的代码呀!
再给你举个例子,比如说你要做一个游戏,游戏里的怪物要一直出现,直到玩家打败它为止。

这时候,while 循环不就派上用场了嘛!只
要怪物还活着,就一直让它出现,多方便呀!
你说 while 循环是不是超级厉害?它就像是我们编程世界里的一把
神奇钥匙,能打开好多好多有趣的大门!所以呀,一定要好好掌握它哦,朋友!我觉得吧,while 循环就是编程中不可或缺的一部分,没有它,很多事情都没法那么轻松地实现啦!。

2021年WHILE循环语句的翻译程序设计(递归下降法,输出四元式)之令狐采学创编

2021年WHILE循环语句的翻译程序设计(递归下降法,输出四元式)之令狐采学创编

课内实践报告课程名称编译原理设计题目WHILE循环语句的翻译程序设计(递归下降法,输出四元式)学院计算机科学与技术专业班级计算机1203班姓名闵丹枫指导教师林泓*欧阳光明*创编 2021.03.07课程设计任务书学生姓名:闵丹枫专业班级:计算机1203班指导教师:林泓工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(递归下降法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 9月 1日系主任(或责任教师)签名:月日WHILE循环语句的翻译程序设计(递归下降法、输出四元式)一.系统描述1.1问题描述设计一个WHILE〈布尔表达式〉DO〈赋值语句〉循环语句的词法﹑语法及语义分析程序,语法分析选择递归下降法,采用用语法制导翻译输出中间代码四元式。

《编译原理》课程设计说明书_DO_WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)

《编译原理》课程设计说明书_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个部分组成:总控程序,也可以称为驱动程序。

while语句的翻译—递归子程序法—三地址表示——编译原理课程设计报告.

while语句的翻译—递归子程序法—三地址表示——编译原理课程设计报告.

课程设计题目WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)学院计算机科学与技术学院专业计算机科学与技术班级0806姓名张方纪指导教师郭羽成2010 年 1 月7 日课程设计任务书学生姓名:张方纪专业班级:计算机0806班指导教师:郭羽成工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2010年 11月 23日系主任(或责任教师)签名: 2010年 11月 23日WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1任务使用C++语言编写一个while循环语句的翻译程序,使用递归下降法进行语法分析,输出三地址码表示。

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)

附件1:学号:0120910340525课程设计题目DO-WHILE(简单优先法、输出三地址表示)学院计算机科学与技术专业计算机科学与技术班级0905姓名明正超指导教师杨克俭2012 年 1 月 3 日课程设计任务书学生姓名:明正超专业班级:计算机0905班指导教师:杨克俭工作单位:计算机科学与技术学院题目: DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名: 2011年 11月23日系主任(或责任教师)签名: 2011年 11月 23日(一)系统描述根据所学编译原理有关词法分析,语法分析,语义分析有关规则,对DO_WHILE循环语句的翻译程序进行设计,使用高级语言或者伪代码形式,进行编写,其中要求使用简单优先法法并在程序的最终结果中显示出表达式的三地址形式。

编译原理E课内实践报告:WHILE循环语句的翻译程序设计与实现,递归下降法,输出四元式

编译原理E课内实践报告:WHILE循环语句的翻译程序设计与实现,递归下降法,输出四元式

文法及属性文法的描述 ............................................................................................... 2 2.1 2.2 文法描述 ............................................................................................................. 2 属性文法描述 ..................................................................................................... 3
2.2 属性文法描述
形式上讲,属性文法是一个三元组 :A=(G,V,F), 其中: ➢ G:是一个上下文无关文法; ➢ V:有穷的属性集,每个属性与文法的一个终结符或非终结符相连 ,这些属性代表与 文法符号相关信息; ➢ F:关于属性的属性断言或一组属性的计算规则(称为语义规则) 。 断言或语义规则 与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。 属性文法中的属性分成两类:继承属性和综合属性。 ➢ 综合属性(synthesized attribute) :如果 b 是 A 的属性,c1 , c2 , …, ck 是产生式右 部文法符号的属性或 A 的其它属性,则称 b 是文法符号 A 的综合属性。 ➢ 继承属性(inherited attribute):如果 b 是产生式右部某个文法符号 X 的属性,并且 c1,c2,…,ck 是 A 或产生式右部文法符号的属性, 则称 b 是文法符号 X 的继承属性。
3

FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)

FOR循环语句的翻译程序设计(递归下降法、输出四元式表示)

1、系统描述 (2)1.1、实验思想 (2)1.2、设计内容 (2)1.3、翻译过程 (2)1.3.1、词法分析: (2)1.3.2、语法分析: (3)1.3.3、中间代码生成: (4)1.3.4、属性文法: (4)2、递归下降法 (4)2.1、递归下降法的主要思想: (4)2.2、用程序表示递归子程序的内部结构: (4)2.3、递归下降法对文法的限制: (5)3、语法制导翻译 (5)3.1、翻译任务的处理过程 (5)3.2、语法制导翻译: (5)3.3、基于属性文法的处理方法 (6)4、中间代码形式的描述及中间代码序列的结构设计 (6)5、简要的分析与概要设计 (6)5.1、词法分析: (6)5.2源代码 (8)5.3 运行结果 (9)6、测试方法和测试结果 (15)6.1测试过程 (15)6.2测试结论 (17)7、课程设计总结 (18)8、参考文献 (19)1、系统描述1.1、实验思想通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。

1.2、设计内容本设计按照要求设计出for语句的简单文法,并使用递归下降分析法对用户输入的程序进行分析和翻译。

对下列正确的程序输入:for i=1 step 1 until 10 do k=j #结果程序要对该输入进行词法分析,然后利用递归下降的分析法对词法分析得到的单词序列进行语法分析,经过语法制导翻译显示出等价的三地址表示的中间代码。

对于错误的程序输入,如:For i=1 step 1 until 10 k=j#结果程序要指出程序出错。

1.3、翻译过程1.3.1、词法分析:词法分析是计算机科学中将字符序列转换为单词(Token)序列的过程。

进行语法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。

DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

(二)DO-WHILE循环语句的翻译程序设计(简单优先法、输出四元式)一、1.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。

PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

直到最后栈内只剩下开始符号,输入串读到“#”为止。

此时识别正确。

可分点描述如下:(1)、对句型中相邻的文法符号规定优先关系,以寻找句型中的句柄;(2)、规定句柄内各相邻符号之间具有相同的优先级;(3)、规定句柄两端符号优先级要比位于句柄之外而又和句柄相邻的符号的优先级高,以先归约句柄;(4)、对于文法中所有符号,只要它们可能在某个句型中相邻,就要为它们规定相应的优先关系,若某两个符号永远不可能相邻,则它们之间就无关系.2.简单优先矩阵用于表示文法符号之间的简单优先关系的矩阵。

3.简单优先法的优缺点优点:技术简单,当做简单优先矩阵是要求较短。

缺点:适用范围小,分析表尺寸太大。

二、源代码实现:#include<iostream>#define MAX 35#include<list>#include<string>#include<fstream>using namespace std;#define TABLE_LEN 8#define STR_LEN 256int zhlen;char sTable[TABLE_LEN+1] = {"+-*/()i#"};//顺序索引int ShipTable[TABLE_LEN][TABLE_LEN] = //优先表{{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1,-1,-1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{ 1, 1, 1, 1,-1, 1,-1, 1},{-1,-1,-1,-1,-1, 0,-1,-2},{ 1, 1, 1, 1,-2, 1,-2, 1},{ 1, 1, 1, 1,-2, 1,-2, 1},{-1,-1,-1,-1,-1,-2,-1, 0}};char X,a;char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};charp[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0","FR\0","*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};char stack[MAX];char queue[MAX];int sp,front;intM[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1},{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,3,2,-1},{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1,8,8, 8},{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},};int f=0; int count=0;int c=0;char arr_i[MAX];char var[MAX]; //表格管理int td[MAX]; int t=0;int opd=-1;int opr=-1;int id=0;int d=0;char arr[MAX][4];//存放待输出的四元式//char keyword[2][7]={"do\0","while\0"};bool IsCharInStr(char c,char s[]){for(int i=0;s[i]!='\0';i++){if(s[i]==c)return true;}return false;}int GetIndex(char s[],char c){for(int i=0;s[i]!='\0';i++){if(c==s[i])return i;}return -1;}//string GetSubString(char s[],int from,int to){string st;for(int i=from;i<to;i++){st+=s[i];}return st;}/*******************************************翻译赋值表达式********************************************/void translatefuzhi(char *sInput){//栈结构的初始化char Stack[STR_LEN]={0};int index = 0;int top = 1;Stack[0] = '#';list<char> rPolish;list<string> Num;int begin=0;while(sInput[begin]!='='){if(IsCharInStr(sInput[begin],sTable)){cout<<"Equal expression is illegal!"<<endl;return ;}begin++;}Num.push_back(GetSubString(sInput,0,begin));int now = begin+1;int before = begin;rPolish.push_back('i');while(sInput[now]!='\0'){if(IsCharInStr(sInput[now],sTable)){char temp[3]={0};if(now-before>1){temp[0] = 'i';temp[1] = sInput[now];Num.push_back(GetSubString(sInput,before+1,now));}else{temp[0] = sInput[now];}int i=0;while(temp[i]!=0){int left = GetIndex(sTable,Stack[index]);int right = GetIndex(sTable,temp[i]);switch(ShipTable[left][right]){case -1://移入Stack[top++] = temp[i];index = top-1;i++;break;case 0://脱括号if(Stack[index]=='('){Stack[top++] = ')';Stack[index] = 'E';top = index+1;index--;}else//规约{if(top!=2){return;}rPolish.push_back('=');list<char>::iterator iter;list<string>::iterator siter=Num.begin();string fuzhi[256];int d=0,m;for(iter=rPolish.begin();iter!=rPolish.end();iter++){if(*iter=='i'){fuzhi[d++]=*siter;siter++;}else{fuzhi[d++]=*iter;}}m=d;string op1,op2;int flag,xiabiao=0;for(d=0;d<m;d++)cout<<"("<<fuzhi[d]<<","<<op1<<","<<op2<<","<<"T"<<xiabiao<<")"<<endl;fuzhi[d] = "T";fuzhi[d]+=(xiabiao+'0');xiabiao++;}//cout<<fuzhi[d];}return;}i++;break;case 1://归约if(Stack[index]=='i'){rPolish.push_back('i');Stack[index] = 'E';index--;}else{rPolish.push_back(Stack[index]);Stack[index-1] = 'E';top = index;index-=2;}break;default:return;}}before=now;}now++;}}int len(char str[]){int i=0;while(str[i]!='\0')i++;return i;}int index(char ch,char str[]){int i=0;while(str[i]!='\0'){if(ch!=str[i])i++;else break;}if(str[i]=='\0')return -1;return i;}void err(int n){if(n==1)cout<<"字符不匹配"<<endl;else if(n==2)cout<<"字符没有出现在产生式中"<<endl;else if(n==3)cout<<"没有找到合适的¨选产式"<<endl;else cout<<"该句子是文法语言的句子"<<endl;}void print(){cout<<"(";if(count<10)cout<<'0';cout<<count<<")";int i;for(i=0;i<=sp;i++)cout<<stack[i];for(;i<=20;i++)cout<<" ";for(i=0;i<front;i++)cout<<" ";for(;queue[i]!='#';i++)cout<<queue[i];cout<<queue[i];for(;i<=20;i++)cout<<" ";}void semantic(){if(VT[opr]=='='){arr[d][0]='=';arr[d][1]=arr_i[opd];arr[d][2]=id;arr[d][3] ='--';id++;}elseif(opr==-2){arr[d][0]='=';arr[d][1]=id-1;arr[d][2]=arr_i[opd];arr[d][3]='--';} else {arr[d][0]=VT[opr];arr[d][1]=arr_i[opd];arr[d][2]=id;if(VT[opr]!='<'&&VT[opr]!='>')arr[d][3]=id-1;else arr[d][3]=id+1;id++;} d++;}void syntax(){//语法分析int n;count++;print();X=stack[sp];a=queue[front];if(X=='#'&&a=='#')f=4;if(X<'A'||X>'Z'){if(X==a){sp--;front++;if(a!='i'){if(a!='d'&&a!='w'&&a!=';'&&a!='#'){opr=index(a,VT);semantic();}else if(a==';'||a=='w'||a=='#'){opr=-2;semantic();}cout<<'\t'<<'\''<<a<<"'匹配"<<endl;}else {opd=c;cout<<'\t'<<'\''<<arr_i[c++]<<"'匹配"<<endl;}}else f=1;}else {int tx=index(X,VN);int ta=index(a,VT);n=M[tx][ta];td[t++]=M[tx][ta];if(ta==-1){f=2;cout<<a<<endl;}else if(n==-1)f=3;else {sp--;cout<<'\t'<<X<<"->";if(len(p[n])!=0){for(inti=len(p[n])-1;i>=0;i--){stack[++sp]=p[n][i];cout<<p[n][len(p[n])-1-i];} cout<<endl;}else cout<<"空串"<<endl;}}if(f==0)syntax();else {td[t]='-1';err(f);}}void lexical(){ //词法分析int i,j,d;char ch;j=d=0;for(i=0;var[i]!='#';i++){ch=var[i];if(ch=='d'&&var[i+1]=='o'){cout<<"do"<<'\t'<<"keword"<<endl;queue[j++]='d' ;i+=1;}else if(ch=='w'){ch=var[i+1];if(ch=='h'){ch=var[i+2];if(ch=='i'){ch=var[i+3];if(ch=='l'){ch=var[i+4];if(ch=='e'){ch=var[i+5];}}}}cout<<"while"<<'\t'<<"keyword"<<endl;queue[j++]='w';i+=4;}else if(index(ch,VT)<=0){if(ch!='{'&&ch!='}'&&ch!='('&&ch!=')'){cout<<ch<<'\t'<<"variable:i["<<d++< <"]"<<endl;arr_i[d-1]=ch;queue[j++]='i';}else cout<<ch<<'\t'<<"bound"<<endl;}elseif(index(ch,VT)>0){cout<<ch<<'\t'<<"operator"<<endl;queue[j++]=ch;} }queue[j]='#';for(i=0;queue[i]!='#';i++)cout<<queue[i];cout<<endl;}int main(){int i=0,j=0;int len,length;char temp;char S='K';sp=front=0;stack[0]='#';sp++;stack[1]='K';cout<<" ****************************"<<endl;cout<<" * DO-WHILE循环语句 *"<<endl;cout<<" * (简单优先法输出四元式) *"<<endl;cout<<" ****************************"<<endl;ifstream table;table.open("dowhile.txt");if(!table){cout<<"error!";}table.seekg(0,ios::end);length = table.tellg();table.seekg(0,ios::beg);while(length!=table.tellg()){table.read((char*)&temp,1);var[i]=temp;i++;if(var[i]==' ')i--;if(var[i]=='#')break;}table.close();len=i;var[i]='\0';cout<<"词法分析"<<endl;lexical();char fuzhi[20];int flag1,fuzhilen;int s=0; for(i=0;i<len;i++){if(var[i]==';'){flag1=i;}}fuzhilen=flag1-2;for(i=3;i<flag1;i++){fuzhi[s++]=var[i];}fuzhi[s]='#';char shuru;char zh[100];int kaishi=0;zh[0]='d';for(kaishi=1;kaishi<s+1;kaishi++){zh[kaishi]=fuzhi[kaishi-1];}zh[kaishi++]=';';zh[kaishi++]='W';for(i=flag1+8;i<len;i++){if(var[i]=='}')break;else{zh[kaishi++]=var[i];}}zh[kaishi++]='#';zhlen=kaishi;cout<<"输出四元式"<<endl;cout<<"do"<<endl;translatefuzhi(fuzhi);cout<<"("<<var[flag1+9]<<","<<var[flag1+8]<<","<<var[flag1+10]<<","<<"T2"< <")"<<endl;cout<<"if T2=true goto T0"<<endl;return 0;}三、测试结果:词法分析部分:输出四元式:四、课程小结:这次编译原理课程设计的题目是用简单优先分析法进行DO-WHILE循环语句的语法分析,并输出四元式.设计的特点是利用定义每个终极符和非终极符之间优先关系,来进行符号的移进与规约,如果栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入。

(完整word版)FOR循环语句的翻译程序设计(LL(1)法、输出三地址)

(完整word版)FOR循环语句的翻译程序设计(LL(1)法、输出三地址)

课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: FOR循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名:年月日系主任(或责任教师)签名:年月日FOR循环语句的翻译程序设计——LL(1)法、输出三地址1.系统描述1.1问题描述用LL(1)法设计、编制、调试一个FOR(表达式1;表达式2;表达式3)〈赋值语句〉的语法及语义分析程序,输出三地址代码。

1.2功能描述(1)能对for循环语句做词法分析,并将其中的某些语句做预处理,如i++转换为i=i+1等。

(2)能依据给定的LL(1)文法判断输入串是否符合LL(1)文法(3)给出输入串的LL(1)分析过程(4)完成对语句中控制变量赋值语句,控制条件语句以及控制变量变换语句的翻译(5)完成对赋值语句包括复杂语句的翻译(6)能够对三个表达式缺少一个或多个的情况下进行翻译(7)用翻译后的语句以三地址代码的中间代码形式正确的表达for循环的执行流程。

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

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 -> CC -> CAC -> AA -> iPAA -> i;P -> +|-|*|/B -> iTiB-> iT -> >|<|>=|<=|==}2.2 语法分析方法描述及语法分析表设计2.2.1 语法分析方法描述:简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。

基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将文法的产生式保存,设置符号栈S,步骤如下:(1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。

(2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1<a k为止。

(3)由句柄a k...a i在文法的产生式中查找右部为a k…a i的产生式,若找到则用相应左部代替句柄,若找不到则为出错,这时可断定输入串不是该文法的句子。

(4)重复上述(1)、(2)、(3)步骤直到规约完输入符号串,栈中只剩文法的开始符号为止。

DOWHILE循环语句的翻译程序设计(简单优先法输出三地址表示)

DOWHILE循环语句的翻译程序设计(简单优先法输出三地址表示)

1问题描述1.1问题要求DO-WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1.2问题具体步骤输入一个DO-WHILE的语句,进行词法分析,词法分析器利用超前搜索,状态转换等方法,将源程序转化成为一个一个的单词符号二元式,如果词法分析无误,则进入语法分析部分,使用简单优先法进行文法分析,为每个终极符与非终极符之间定义优先关系,利用优先关系进行移进-规约,如果能规约到文法的开始符,则文法分析成功,输出三地址码.2文法及属性文法的描述2.1文法描述G(s): S->do B while E, B->c:=a+1, E->a>b2.2属性文法描述G(s): S->do B while E,{ S.begin:=newlabel;B.next:=S.begin;E.true:=newlabel;E.false:= S.next;S.code:=gen(S.begin’:’) |B.code |E.code |gen(E.true’:’) |gen(‘goto’S.begin) ;}B->c:=a+1{ B.code:= ’c:=a+1’ }E->a>b{ E.code=gen(‘if’’a>b’’goto’ E.true) |Gen(‘goto’ E.false) }E->true{E.code:=gen(‘goto’ E.true) }E->false{E.code:=gen(‘goto’ E.false) }3 语法分析方法描述3.1简单优先法的定义一个文法G,若它不含产生式,也不含任何右部相同的不同产生式,并且它的任何符号对(X,Y),或者没有关系,或者存在下述三种关系:=、<、>之一,则称该文法是一个简单优先文法。

A)X=Y当且仅当G中含有形如P…XY…的产生式4.简单优先法的基本思想根据优先关系的定义,将简单优先文法中各文法符号之间的这种关系用一个矩阵表示,称作简单优先矩阵。

WHILE循环语句的翻译程序设计(LR方法、输出四元式)资料

WHILE循环语句的翻译程序设计(LR方法、输出四元式)资料

目录课程设计任务书 (1)1系统描述 (2)2文法及属性文法描述 (2)2.1文法的描述 (2)2.2属性文法的描述 (2)3语法分析方法描述及语法分析表设计 (2)3.1语法分析表设计 (2)3.1.1文法的DFA (3)3.1.2LR(0)分析表 (4)3.1.3LR(0)分析方法描述说明 (4)4中间代码形式的描述及中间代码序列的结构设计 (4)5编译系统的概要设计 (5)5.1词法分析 (5)5.2语法分析 (6)5.3语法制导翻译 (7)6详细的算法描述 (8)7 软件的测试方法和测试结果 (14)8小结与体会 (18)9参考文献 (18)本科生课程设计成绩评定表 (20)课程设计任务书学生姓名:王世创专业班级:计算机0909班指导教师:高曙工作单位:计算机科学与技术学院题目: WHILE循环语句的翻译程序设计(LR方法、输出四元式)初始条件:理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。

如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码四元式的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。

课程设计报告书正文的内容应包括:1 系统描述(问题域描述);2 文法及属性文法的描述;3 语法分析方法描述及语法分析表设计;4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;5 编译系统的概要设计;6 详细的算法描述(流程图或伪代码);7 软件的测试方法和测试结果;8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);9 参考文献(按公开发表的规范书写)。

时间安排:设计安排一周:周1、周2:完成系统分析及设计。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计任务书学生姓名:赵旭林专业班级:计算机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日编译原理课程设计——WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)1、系统要求及描述1.1 实验要求1.目的通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

2.设计内容及要求对循环语句: WHILE〈表达式〉DO〈赋值语句〉(1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。

(2)按给定的题目给出语法分析方法的思想及分析表设计。

(3)按给定的题目给出中间代码序列的结构设计。

(4)完成相应的词法分析、语法分析和语义分析程序设计。

(5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

1.2 递归下降法原理递归子程序法是一种确定的自顶向下的语法分析方法。

它的主要原理是,对每个非终极符按其产生式结构构造相应语法分析子程序,每个过程的功能是识别由该非终结符推出的串,当某非终结符的产生式有多个候选项时,能够按LL(1)的形式可唯一确定某个候选式进行推导。

其中终极符产生匹配命令,而非终极符则产生过程调用命令。

因为文法递归相应子程序也递归,所以称这种方法为递归子程序下降法或递归下降法。

其中子程序的结构与产生式结构几乎是一致的。

缺点:对文法要求高,必须满足LL(1)文法,如果某个产生式的推导不满足LL(1)而满足LL(2)时,也可采用多向前扫描一个符号的办法。

另一个缺点是:由于递归调用过多,所以速度慢,占用空间多。

1.3三地址码具体形式三地码形式如下:X:= y op z条件语句while(A) do B翻译成:Begin:1.if Agoto 32.goto exit3.do B4.gotobeginexit2、系统设计及说明2.1 系统设计及流程图2.1.1 文法设计while语句文法设计为:S -> while (A) S | i=E;A ->B op B || BOp ->&& | ||B -> E relop Erelop ->< | == | > | >= | <=E -> E+E | E-E | E*E | E/E | (E) | i | n由于文法左递归,而递归下降法的基本要求是文法必须是LL(1)文法,不能有左递归,所以将文法消除左递归得:S -> while (A) S | i=E;A ->B | B op BOp ->&& | ||B -> E relop Erelop ->= |<| >| == | >= | <=E -> (E)F | iF | nFF -> +EF | -EF | *EF | /EF | ε2.1.2属性文法设计2.1.3系统流程图2.2伪代码设计及分析2.2.1 数据结构说明源文件为source.txt,词法分析结果存放在lex.txt,三地址码存放在syntax.txt中。

每个文件都有相对应的输入输出流来实现文件中数据的读取与保存。

结构体word用在词法分析中,用于保存单词的属性值和类型。

KeyWord数组用于保存关键字,对应有一个函数iskeyword()判断是否是关键字。

2.2.2 词法分析设计与实现在程序中,词法分析的部分是直接用实验一的程序。

但要注意的问题是,由于在做实验一的时候没有考虑到代码重用问题,所以整个程序显得比较凌乱,和课程设计要求不太符合,所以在重用代码的时候修改了一下,使之更加符合课程设计程序的整体要求。

2.2.3语法分析设计与实现由于递归下降法是一种自顶向下的语法分析方法,所以在判断给出的句子语法是否正确时是用文法的开始符号推导出句子,如果推导成功,那么给定的句子语法正确,如果不成功,那么说明有语法错误。

每个非终结符的伪代码设计如下:1.S的子程序的伪代码:int S(){取单词;if (str是"while"关键字){取下一次单词;if (str == "("){ 调用非终结符A的子程序;取下一次单词;if (str == ")"){调用A()的子程序;}}else{while后面应该有"(", 返回; }}elseif (str 是变量){ 取单词;if (是"="){调用E()的子程序;取单词;if (不是";"){出错,结尾应该是";";} }}}2. A的子程序伪代码:int A(){ 调用B()的子程序;取单词;if(是&&或者||){ 代表用的推导式为:S -> B op B;调用B()的子程序;;}elseif (后一个单词时变量或者是界符){ 代表用的推导式为:S -> B\}}3.B的子程序伪代码:int B(){ 调用E的子程序;取单词;if(是运算符){ 调用E的子程序;}else{ 出错返回;}}4.E的子程序伪代码:int E(){ 取单词;if(是"("){ 调用E的子程序;取单词;if(是")") { 匹配,返回正确;}else {括号不匹配,出错返回;}}elseif (是变量){ 用的推导式为:E -> iF,调用F()子程序;}elseif (是数字){ 用的推导式为:E -> iF,调用F()子程序;}else {出错处理;}}5.F子程序为伪代码:int F(){ 取单词;if(是"+") { 用的推导式为:F -> +EF; E(); F();}elseif (是"-"){ 用的推导式为:F -> -EF; E(); F();}elseif (是"*"){ 用的推导式为:F -> *EF; E(); F();}elseif (是"/"){ 用的推导式为:F -> /EF; E(); F();}elseif (是变量或者界符){用的推导式为:F ->ε;}else { 出错返回;}}2.2.4 语义分析设计与实现除了能正确地画出语法图并化简,求出FIRST,FOLLW集外,在实现过程中还要想方设法保证输出的产生式规则(三地址代码)严格按照自顶向下、从左至右的顺序进行,为了达到这一要求,需要在每次调用与某个语法变量相应的处理程序时,一进入过程就输出该规则(生成相应的三地址代码),而在有些情况下,为了正确地选择匹配的规则(生成相应的三地址代码)必须连续向前看若干的符号(token),这时应分析过的符号暂时用栈保存起来。

3、调试过程及实验结果分析3.1调试过程1. 要特别注意产生式F->ε,因为它代表的产生式不退出任何符号,所以不能像其他产生式一样直接判断。

如果是得话A -> B | B op B2.因为在lex文件中第一排是文字说明,所以不能直接在getstr取出单词,因此又定义了一个新的函数,将单词取出放在一个新的文件_lex.txt中3. 注意每个子程序的返回值,如果正确返回1,出错返回0,而且在出错前应该提示错误的信息,比如说刚开始匹配while后面的单词时,如果不是“)”,应该提示“while 后面缺“)”。

”然后返回,不能再继续处理后面的内容。

3. 刚开始用文件流从文件中读取信息时候,发现再第一个文件流读取完文件并且关闭的时候,再次打开文件读取,发现读取出来的数据为空。

上网查阅资料发现,用文件输入流打开第一个文件,然后对文件内容处理,当结束使用该输入流时,流被设置了eof或者fail,eof为end of file(文件结束符),fail为可恢复错误状态。

例如:fin.open(file1);while(fin >> temp){//do some thing}跳出循环,即是遇到输入错误或者文件结束符。

此时流状态被设置为eofbit或者failbit。

而fin.close()只关闭该流对文件的关联,并不清除错误状态,而必须使用fin.clear()清楚流里面的结束或者错误状态。

3.2 实验结果在调试完程序之后,查看实验结果。

1.正确输入:图表1符合文法要求输入2.词法分析的结果:图表2词法分析结果在词法分析的结果中,行号代表单词出现在文件中的第几行,属性代表单词是关键字(1)、运算符(2)、变量(4、常数(0)、界符(3)。

3.分析过程:图表3分析过程3:输出三地址码:图表4三地址码4:输入错误的情况:图表5输入错误5:输入错误情况下的分析:结果分析:根据实验结果可以发现,程序能对输入串进行词法分析,并且在词法分析的基础上进行语法分析,能判断给定的串是否符合文法要求,并且能明确给出推导过程。

在输入串不符合文法要求的时候,能给出错误提示,然后退出系统。

4、设计心得与改进方案4.1 心得体会1.课程设计较以往的课程设计来说难了很多,因为老师布置题目下来的时间比较早,因此有了较为充分的时间进行程序设计和编写工作,但总的来说时间还是很紧,程序还有许多需要改进的地方,也让我明白了做事情不能拖,一旦有了任务需要抓紧时间完成,不能等到最后临时抱佛脚。

相关文档
最新文档