资源简介
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
- 上一篇:具有保护及自恢复能力的多路直流稳压电源
- 下一篇:LCC谐振变换器的电路特性分析
评论
共有 条评论