1、(11)C-A/A(12)C-A*/int lineno = 1;char ch ; int anltable2222= /*S*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, /*if*/ 0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*E*/ 0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*then*/0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, /*B*/ 0,0,0,0,0,3,0,0,0,0,0,0,0,
2、0,0,0,0,0,0,0,0,2, /*else*/0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, /*(*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*)*/ 0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /* /*=*/ 0,0,0,0,0,0,0,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0, /*A*/ 0,0,0,0,0,0,0,3,3
3、,3,0,0,0,0,0,0,2,3,3,3,3,0, /*d*/ 0,0,0,0,0,0,0,2,2,2,3,0,0,0,0,0,2,2,2,2,2,0, /*num*/ 0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,2,2,2,2,2,0, /*C*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, /*+*/ 0,0,0,0,0,0,0
4、,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*_*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*/*/ 0,0,0,0,0,0,0,0,0,0,0,3,1,1,0,0,0,0,0,0,0,0, /*#*/ 1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,;/0-error ,1= ,3=char allname3030;/单词全名char out3030;/保存单词简称int leng
5、th;struct att/名字表类型 string sname; char select; char addre;att attname40;/名字表typedef struct SqStack char *base; char *top; int stacksize;SqStack;/栈定义void InitStack (SqStack &S) /栈初始化 S.base=(char*)malloc(STACK_INIT_SIZE*sizeof(char);/分配存储空间 if(!S.base) exit(OVERFLOW); /为栈S分配存储空间失败 S.top=S.base; S.sta
6、cksize=STACK_INIT_SIZE; int push(SqStack &S,char ch) / 将元素e插入到栈S中,成为新的栈顶元素 if(S.top-S.base S.stacksize) /判定栈是否满 S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT *sizeof(char); printf(分配存储单元失败.n); /存储单元分配失败 exit(OVERFLOW); S.top=S.base+S.stacksize; /指明栈顶指针的基址 S.stacksize+=STACKINCREMENT; /指明栈
7、的空间大小 / end of if *S.top+=ch; /先将e送入栈顶指针所指向的单元,再将栈顶指针加1 return(OK); /end of Push() subfunction int pop(SqStack &S,char &ch) /栈顶元素出栈 if(S.top=S.base) printf(溢出 return (ERROR); ch=*-S.top;char gettop(SqStack S) /返回栈顶元素 if(S.top=S.base) cout return 8; return 9;= return 10;A return 11;d return 12;n retu
8、rn 13;C return 14; return 15; return 16;+ return 17;- return 18;* return 19;/ return 20;# return 21; default: return 88; int judge(char *string) /判断是否是关键字 char *keywords1000=if,thenelse for(int i = 0;i = 2;i+) if (!strcmp(string,*(keywords+i) return 1; return 0;int analysis(ifstream &fin,ofstream &f
9、out) /词法分析程序,用引用传递参数 char temp10; / 临时存放已读入但无法判断类型的字符 int j=0; int ou=0; int na=0; while (fin.get(ch) if (ch = n) lineno += 1; else if (ch = t|ch = ) /排除制表、空格字符 else if (isalpha(ch) /当前输入符为字母 while (isalpha(ch)|isdigit(ch) tempj = ch; j+; fin.get(ch); tempj = 0; /标志字符串结束 j = 0; if(judge(temp) / 判断是否
10、为关键字 memcpy(allnamena,temp,10); attnamena.sname=allnamena; attnamena.select=allnamena0; memcpy(outou,temp,10);ou+; fout(attnamena.sname,关键字) na+; else attnamena.select=,变量) fin.seekg(-1,ios:cur); /回退1个字符 else if (isdigit(ch) while (isdigit(ch) memcpy(allnamena,temp,10); attnamena.sname=allnamena; at
11、tnamena.select= memcpy(outou,temp,10); fout,常量) na+; /回退一个字符) allnamena0=ch; attnamena.select=ch; memcpy(outou,=,10);,算符)+-*/ allnamena0=ch;attnamena.sname=allnamena;attnamena.select=ch;fout,界限符)na+; ,逻辑运算符) outou0= else无法识别字符 ch return 0; ch = attnamena.select= outou0= length=na; return 1;void prin
12、tstack(SqStack &S,int naa,int ty,ofstream &fout) char temp4020; for(int k=0;k40;k+) for(int t=0;t20;t+) tempkt=NULL; int te=0; int i=0,j=0; int nu=0; char *ku; ku=S.base; i=naa+1; char *contrl; contrl=S.base; while(contrl!=S.top) if(*contrl!1 if(*contrl= foutnu=nu+2; else if(*contrl=nu=nu+4;*contrl;
13、nu+; contrl+; foutttt for(i;i=length;i+) if(gettop(S)=#attnamei.select; if(gettop(S)= fout elsetempte; te+;int laynax(ofstream &f) SqStack S; InitStack(S); push(S, char cch,tempch; int naa=0,over=1,go; int front=0,last=0,choose=0; while(over) /getchar(); front=getnum(gettop(S); last=getnum(attnamena
14、a.select); go=naa; /coutfrontlast choose=anltablefrontlast; if(choose=1) push(S, push(S,attnamenaa.select); printstack(S,go,1,f); naa+; else if(choose=3) else if(choose=2) int a=0;l1: pop(S,cch); if(cch= if(tempch= push(S, printstack(S,go,3,f); over=0; else if(tempch= printstack(S,naa-1,3,f); front=getnum(gettop(S); last=getnum( choose=anltablefrontlast; if(choose=1)push(S, a=1; /cout归约了A printstack(S,go-1,3,f);归约了Bnaa+;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1