• 大小: 956KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2024-03-16
  • 语言: 其他
  • 标签: DO-WHILE  

资源简介

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

资源截图

代码片段和文件信息

#include“Stack.h“
#include
#include
#include 
using namespace std;
#define norw 13    //关键字的个数
#define nmax 14    //数字的最大位数
#define al 10      //符号的最大长度
#define N -10       
#define getchdo if(getch()==-1)return -1
#define getsymdo if(getsym()==-1)return -1
ifstream *fin;
SeqStack SymOptOpr;
char *pch;
char str[20];    
char inputstr[100]; //保存从文件读入的所有字符
char buf[5][20];
int count1=0count2=0;
int ip=0rowline;
enum symbol sym;   //当前的符号
int num;           //当前number
char a[al+1];      //临时符号
char id[al+1];     //当前ident
char word[norw][al];  //保留字
enum symbol wsym[norw];    //关键字的符号值
enum symbol ssym[256];     //单字符的符号值   
enum symbol{
      nul ident number plus   minus  times
  slash    oddsym     eql        neq      lss       leq 
  gtr      geq        lparen     rparen   lbrace    rbrace
  comma    semicolon  period     becomes  beginsym  endsym
          ifsym    elsesym    whilesym   writesym readsym   dosym
  callsym  constsym   varsym     procsym
}; 
void ThreeAddr();
void init()
{
//设置单字符符号
for(int i=0;i<=255;i++)
{
ssym[i]=nul;
}
ssym[‘+‘]=plus;
ssym[‘-‘]=minus;
ssym[‘*‘]=times;
ssym[‘/‘]=slash;
ssym[‘(‘]=lparen;
ssym[‘)‘]=rparen;
ssym[‘{‘]=lbrace;
ssym[‘}‘]=rbrace;
ssym[‘=‘]=eql;
ssym[‘‘]=comma;
ssym[‘.‘]=period;
ssym[‘#‘]=neq;
ssym[‘;‘]=semicolon;
//设置保留字名字,
strcpy(&(word[0][0])“begin“);
strcpy(&(word[1][0])“call“);
strcpy(&(word[2][0])“const“);
strcpy(&(word[3][0])“do“);
strcpy(&(word[4][0])“end“);
strcpy(&(word[5][0])“if“);
strcpy(&(word[6][0])“odd“);
strcpy(&(word[7][0])“procedure“);
strcpy(&(word[8][0])“read“);
strcpy(&(word[9][0])“then“);
strcpy(&(word[10][0])“var“);
strcpy(&(word[11][0])“while“);
strcpy(&(word[12][0])“write“);
//设置保留字符号
wsym[0]=beginsym;
wsym[1]=callsym;
wsym[2]=constsym;
wsym[3]=dosym;
wsym[4]=endsym;
wsym[5]=ifsym;
wsym[6]=oddsym;
wsym[7]=procsym;
wsym[8]=readsym;
wsym[9]=elsesym;
wsym[10]=varsym;
wsym[11]=whilesym;
wsym[12]=writesym;
}


char rule[12][20]={
“S->do{B}while(E)\0“
“B->d=C;\0“
“C->A+A\0“
        “C->A-A\0“
“C->A*A\0“
“C->A/A\0“
“C->A\0“
        “E->A>A\0“
        “E->A “E->A==A\0“
“E->A\0“
“A->d\0“};  //文法

int getch()
{
if(fin->get(ch))
{
if(ch!=‘ ‘ && ch!=9 && ch!=10)
{
inputstr[ip]=ch;     
ip++;
}     
cout< return 0;
}
else return -1;
}
//词法分析
int getsym()
{
int ijk;
while(ch==‘ ‘||ch==10||ch==9)
{
getchdo;
sym=nul;
}
if(ch>=‘a‘&&ch<=‘z‘)
{
k=0;
do{
if(k {
a[k]=ch;
k++;
}
getchdo;
}while(ch>=‘a‘&&ch<=‘z‘||ch>=‘0‘&&ch<=‘9‘);
a[k]=0;
strcpy(ida);
i=0;
j=norw-1;
do{              //搜索当前符号是否为保留字
k=(i+j)/2;
if(strcmp(idword[k])<=0)
{
j=k-1;
}
    if(strcmp(idword[k])>=0)
{
i=k

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       4353  2010-01-06 19:03  compile\compile.dsp

     文件        537  2010-01-06 08:26  compile\compile.dsw

     文件      50176  2010-01-10 19:55  compile\compile.ncb

     文件      53760  2010-01-10 19:55  compile\compile.opt

     文件        248  2010-01-10 19:55  compile\compile.plg

     文件     577600  2010-01-10 19:55  compile\Debug\compile.exe

     文件     817496  2010-01-10 19:55  compile\Debug\compile.ilk

     文件    2165296  2010-01-07 11:01  compile\Debug\compile.pch

     文件    1131520  2010-01-10 19:55  compile\Debug\compile.pdb

     文件     305585  2010-01-10 19:55  compile\Debug\do-while.obj

     文件      91136  2010-01-10 19:55  compile\Debug\vc60.idb

     文件     135168  2010-01-10 19:55  compile\Debug\vc60.pdb

     文件      11489  2010-01-10 19:56  compile\do-while.cpp

     文件         29  2010-01-10 19:54  compile\simple.txt

     文件       1140  2010-01-07 10:59  compile\Stack.h

     目录          0  2010-01-10 18:35  compile\Debug

     目录          0  2010-01-10 19:56  compile

----------- ---------  ---------- -----  ----

              5345533                    17


评论

共有 条评论