



版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、附件 1小組成員:程序清單Main.c#include<stdio.h>#include<stdlib.h>#include<string.h>void error(int n);void getsym();/void enter(enum object k,int *ptx,int lev,int *pdx);int position(char*idt,int tx);int constdeclaration(int *ptx,int lev,int *pdx);int vardeclaration(int *ptx,int lev,int *pdx);i
2、nt factor(int*ptx,int lev);int term(int *ptx,int lev);int expression(int *ptx,int lev);int statement(int *ptx,int lev);int block();enum objectconstant,variable,procedure;struct tabchar name14;enum object kind;int val;int level;int adr;int size;table100;enum symbolnul,ident,number,plus,minus,times,sl
3、ash,oddsym,eql,neq,lss,leq,gtr,geq,lparen,rparen,comma,semicolon,period,becomes,beginsym,endsym,ifsym,thensym,whilesym,writesym,readsym,dosym,callsym,constsym,varsym,procsym,progsym,;enum symbol sym=nul;enum symbol mulop;enum symbol wsym14;enum symbol ssym256;char ch=' 'char *str;charword141
4、0="begin","call","const","do","end","if","odd","procedure","program","read","then","var","while","write"/設置保留字名字int num;int lev=0;int tx=0;int k;int *mm;/=(int
5、*)malloc(sizeof(int);char *id,sign14;char a14;FILE *fp1,*fp2,*fp3;void error(int n)switch(n)case 1:printf("常數說明中的"="寫成了 ":="。 n");break;case 2:printf("常數說明中 "="后應是數字。n");break;case 3:printf("常數說明中的標識符后應是"="。 n");break;case 4:print
6、f("program,const,var,procedure后應為標識符。n");break;case 5:printf("漏掉了 ","或""。 n");break;case 6:printf("過程說明的符號不正確。n");break;case 7:printf("應該是語句的開始符。n");break;case 8:printf("程序體內語句部分的后跟符不正確。n");break;case 9:printf("程序的結尾丟了句號"
7、;."。 n");break;case 10:printf("語句之間漏了 ""。 n");break;case 11:printf("標識符未說明。n");break;case 12:printf("賦值語句中,賦值號左部標識符屬性應是變量。n");break;case 13:printf("賦值語句左部標識符后應是賦值號":="。n");break;case 14:printf("call后應為標識符。n");break;case
8、15:printf("call后標識符屬性應為過程。n");break;case 16:printf("條件語句中丟了"then"。 n");break;case 17:printf("丟了 "end"或""。n");break;case 18:printf("while型循環語句中丟了"do"。n");break;case 19:printf("語句后的符號不正確。n");break;case 20:printf(
9、"應為關系運算符。n");break;case 21:printf("表達式內標識符屬性不能是過程。n");break;case 22:printf("表達式中漏掉右括號" ) " 。 n");break;case 23:printf("因子后的非法符號。n");break;case 24:printf("表達式的開始符不能是此符號。n");break;case 25:printf("不能識別的符號。n");break;case 26:printf(&qu
10、ot;程序的層次越界。n");break;case 27:printf("程序應該以program 保留字開始。 n");break;case 28:printf("程序沒有程序主體。n");break;case 31:printf("數越界。 n");break;case 32:printf("read語句括號中的標識符不是變量。n");break;case 33:printf("read/write單詞后應為左括號。n");break;case 34:printf("re
11、ad/write語句括號中的標識符應是申明過的變量。break;case 35:printf("read/write語句沒有右括號。n");n");void getsym()int i,n=1,l=0;int j,m;dowhile(ch=' '|ch=10|ch=9)if(ch=10)n+;ch=fgetc(fp1);if(ch>='a'&&ch<='z')/名字或保留字以字母開頭k=0;doif(k<10)ak=ch;k+=1;ch=fgetc(fp1);while(ch>
12、='a'&&ch<='z'|ch>='0'&&ch<='9');/讀取一串字符ak='0'id=a;/字符串最后置結束符單詞自身值賦給idfor(i=0;i<14;i+)for(j=0;j<k;j+)if(aj=wordij)/搜索當前字符是否為保留字continue;elsebreak;if(j=k&&wordij='0')sym=wsymi;break;if(j=k&&wordij!='0
13、9;)sym=ident;break;if(i>13)sym=ident; /將字符串類別值賦給symelse if(ch>='0'&&ch<='9') / 檢測是否為數字:以 0.9 開頭 k=0;num=0;sym=number;doak=ch;num=10*num+(ch-'0');k+=1;ch=fgetc(fp1);while(ch>='0'&&ch<='9');/讀取數字,并轉換為數k-;id=a;if(k>14)num=0;error
14、(31); /數字位數超過14 位出錯printf("第 %d行出錯 n",n);k=0;*(id+k)='0'ak='0'else if(ch=':') /k=0;檢測賦值符號ch=fgetc(fp1);*(id+k)=':'ak=':'if(ch='=')sym=becomes;k=k+1;*(id+k)='='ak='='ch=fgetc(fp1);elseerror(25);printf("sym=nul;/不能識別的符號第 %d
15、行出錯 n",n);else if (ch='<')/檢測小于或小于等于符號k=0;ch=fgetc(fp1);*(id+k)='<'ak='<'if(ch='=')sym=leq;k+=1;*(id+k)='='ak='='ch=fgetc(fp1);elsesym=lss;else if(ch='>') /檢測大于或大于等于符號k=0;ch=fgetc(fp1);*(id+k)='>'ak='>'if(
16、ch='=')sym=geq;k+=1;*(id+k)='='ak='='ch=fgetc(fp1);elsesym=gtr;elseif(ch='+'|ch='-'|ch='*'|ch='/'|ch='('|ch=')'|ch=','|ch='.'|ch='#'|ch=''|ch='=') /單字符符號處理sym=ssymch;k=0;ak=ch;id=a;ch=fget
17、c(fp1);else / 當符號不能滿足上述條件時,全部按不能識別的符號處理 sym=nul;k=0;ak=ch;id=a;error(25);printf("第 %d行出錯 n",n);ch=fgetc(fp1);switch(sym)case nul:str="nul"break;case ident:str="ident"break;case number:str="number"break;case plus:str="plus"break;case minus:str="m
18、inus"break;case times:str="times"break;case slash:str="slash"break;case oddsym:str="oddsym"break;case eql:str="eql"break;case neq:str="neq"break;case lss:str="lss"break;case leq:str="leq"break;case gtr:str="gtr"brea
19、k;case geq:str="geq"break;case lparen:str="lparen"break;case rparen:str="rparen"break;case comma:str="comma"break;case semicolon:str="semicolon"break;case period:str="period"break;case becomes:str="becomes"break;case beginsym:str=
20、"beginsym"break;case endsym:str="endsym"break;case ifsym:str="ifsym"break;case thensym:str="thensym"break;case whilesym:str="whilesym"break;case writesym:str="writesym"break;case readsym:str="readsym"break;case dosym:str="dos
21、ym"break;case callsym:str="callsym"break;case constsym:str="constsym"break;case varsym:str="varsym"break;case procsym:str="procsym"break;case progsym:str="progsym"break;printf("(");for(m=0;m<=k;m+)printf("%c",*(id+m);*(id+
22、k+1)='0'printf("t");printf("%s)",str);printf("n");fprintf(fp2,"(%s%s)",id,str);fprintf(fp2,"n");l+;while(sym=nul && l<10);void enter(enum object k,int *ptx,int lev,int *pdx)/mm=(int *)malloc(sizeof(int);int mmm;(*ptx)+;*table(*ptx)
23、.name=*sign;table(*ptx).kind=k;switch(k)case constant:table(*ptx).val=num;break;case variable:table(*ptx).level=lev;table(*ptx).adr=(*pdx);(*pdx)+;break;case procedure:table(*ptx).level=lev;break;mmm=*ptx;/printf("11111111%d2222222n",mmm);*mm=mmm;int position(char *idt,int tx)int i,j,m;for
24、(j=0;j<k+1;j+)j=*(idt+j);for(i=tx;i>0;i-)for(m=0;m<k+1;m+)if(m!=*(idt+m)break;elsecontinue;if(m=k+1 && m='0')return i;break;elsecontinue;if(i=0)return 0;/* 常量聲明處理*/int constdeclaration(int *ptx,int lev,int *pdx)if(sym=ident)*sign=*a;getsym();
25、if(sym=eql|sym=becomes)if(sym=becomes)error(1);getsym();if(sym=number)enter(constant,ptx,lev,pdx);elseerror(2);elseerror(3);elseerror(4);getsym();return 0;/* 變量聲明處理*/int vardeclaration(int *ptx,int lev,int *pdx)if(sym=ident)*sign=*a;enter(variable,ptx,lev,pdx);getsym();elseerror(4);return 0;/ 因子處理in
26、tfactor(intlev)/*factor*int i;while(sym=ident|sym=number|sym=lparen)/*ptx,int循環直到不是因子開始符號*/if(sym=ident)/*因子為常量或變量*/i=position(id,*ptx);/*查找名字*/if(i=0)error(11);/*標示符未聲明*/getsym();else if(sym=number)if(num>2047)/*/*因子為數數字越界 */*/error(31);num=0;getsym();else/*因子為表達式*/getsym();expression(ptx,lev);i
27、f(sym=rparen)getsym();elseerror(22);/*缺少右括號 */return 0;/*factor*/ 項處理int term(int *ptx,int lev) /*term* */enum symbol mulop; factor(ptx,lev); /*/*用于保存乘除法符號,定義為全局變量處理因子 */*/while(sym=times|sym=slash)getsym();factor(ptx,lev);return 0;/*term*/* 表達式處理 */intexpression(int*ptx,intlev)/*expression*enum sym
28、bol addop; if(sym=plus|sym=minus)/*/*用于保存正負號*/開頭的正負號, 此時當前表達式被看做一個正或負的項*/addop=sym;/保存開頭的正負號getsym();term(ptx,lev);elseterm(ptx,lev); / while(sym=plus|sym=minus) 處理項getsym();term(ptx,lev);/處理項return 0;/*expression*/ 條件語句處理int condition(int *ptx,int lev)enum symbol relop;if(sym=oddsym)getsym();expres
29、sion(ptx,lev);elseexpression(ptx,lev);if(sym!=eql && sym!=neq && sym!=lss &&sym!=leq && sym!=gtr &&sym!=geq)error(20);elserelop=sym;getsym();expression(ptx,lev);return 0;/ 語句處理int statement(int *ptx,int lev)int i;if(sym=ident)i=position(id,*ptx);if(i=0)error(1
30、1);elseif(tablei.kind!=variable)error(12);i=0;elsegetsym();if(sym=becomes)getsym();elseerror(13);expression(ptx,lev);printf("fprintf(fp2,"賦值語句 n");賦值語句n");else if(sym=readsym)getsym();if(sym!=lparen)error(33);elsedogetsym();if(sym=ident)i=position(id,*ptx);elsei=0;if(i=0)error(34
31、);getsym();while(sym=comma);if(sym!=rparen)error(35);elsegetsym();printf("Read語句 n");fprintf(fp2,"Read語句 n");else if(sym=writesym)getsym();if(sym=lparen)dogetsym();expression(ptx,lev);while(sym=comma);printf("write語句 n");fprintf(fp2,"write語句 n");if(sym!=rparen
32、)error(35);elsegetsym();else if(sym=callsym)getsym();if(sym!=ident)error(14);elsei=position(id,*ptx);if(i=0)error(11);elseif(tablei.kind!=procedure)error(15);getsym();printf("call語句 n");fprintf(fp2,"call語句 n");elseif(sym=ifsym)getsym();condition(ptx,lev);if(sym=thensym)getsym();e
33、lseerror(16);statement(ptx,lev);printf("if語句 n");fprintf(fp2,"if語句 n");else if(sym=beginsym)getsym();statement(ptx,lev);doif(sym=semicolon)getsym();elseerror(10);statement(ptx,lev);while(sym=semicolon);printf("Begin.end語句 n");fprintf(fp2,"Begin.end語句 n");if(sy
34、m=endsym)getsym();if(sym=procsym)block();elseerror(17);else if(sym=whilesym)getsym();condition(ptx,lev);if(sym=dosym)getsym();elseerror(18);statement(ptx,lev);printf("while語句 n");fprintf(fp2,"while循環 n");return 0;int block()int dx=3,tx0;tx0=tx;if(lev>3)error(26);doif(sym=const
35、sym)getsym();if(sym=ident)constdeclaration(&tx,lev,&dx);while(sym=comma)getsym();if(sym=ident)constdeclaration(&tx,lev,&dx);elseerror(4);if(sym=semicolon)getsym();elseerror(5);elseerror(4);if(sym=varsym)getsym();if(sym=ident)vardeclaration(&tx,lev,&dx);while(sym=comma)getsym(
36、);if(sym=ident)vardeclaration(&tx,lev,&dx);elseerror(4);if(sym=semicolon)getsym();elseerror(5);elseerror(4);if(sym=procsym)lev+;dogetsym();*sign=*a;if(sym=ident)enter(procedure,&tx,lev,&dx);getsym();elseerror(4);if(sym=semicolon)getsym();elseerror(5);if(-1=block()return -1;if(sym=sem
37、icolon)getsym();elseerror(5);while(sym=procsym);while(sym!=beginsym);statement(&tx,lev);tabletx0.size=dx;return 0;void main()/freopen("in.txt","r",stdin);int i,j,n;char nn14;char file1name10,file2name10,file3name10;mm=(int *)malloc(sizeof(int);printf("輸入源程序的文件名:t");
38、scanf("%s",file1name);getchar();fp1=fopen(file1name,"r");if(!fp1)printf("cannot open the filen");printf("輸入用于存放詞法分析二維表的文件的文件名:t");scanf("%s",file2name);getchar();fp2=fopen(file2name,"w");if(!fp2)printf("cannot open the filen");pri
39、ntf(" 輸入用于存放語法分析 TABLE表的文件的文件名 :t"); scanf("%s",file3name);getchar();fp3=fopen(file3name,"w");if(!fp3)printf("cannot open the filen");for(j=0;j<255;j+)ssymj=nul;ssym'+'=plus;ssym'-'=minus;ssym'*'=times;ssym'/'=slash;ssym'('=lparen;ssym')'=rparen;ssym'='=eql;ssym','=comma;ssym'.'=period;ssym'#'=neq;ssym''=semicolon;wsym0=beginsym;wsym1=callsym;wsym2=constsym;wsym3=dosym;wsym4=endsym;wsym5=ifsym;wsym6=oddsym;wsym7=procsym;wsym8=prog
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 語音識別試題及答案
- 阿里定級面試題及答案
- 房地產銷售策略與實戰
- 2025年 道真自治縣“特崗計劃”教師招聘考試筆試試卷附答案
- 員工安全培訓手冊
- 2025年中國噴氣背包行業市場全景分析及前景機遇研判報告
- 2025年中國內衣褲洗衣機行業市場全景分析及前景機遇研判報告
- 急救培訓圓滿畢業
- 住院患者護理風險評估制度
- 腫瘤晚期患者教育
- 2024年貴州省普通高中學業水平選擇性考試地理試題(原卷版+解析版)
- ISO 37001-2025 反賄賂管理體系要求及使用指南(中文版-雷澤佳譯-2025)
- 特種設備安全管理的應急預案編制
- 高壓環網柜施工方案
- 報銷醫保委托書
- 2025年內蒙古錫林郭勒盟事業單位人才引進歷年高頻重點提升(共500題)附帶答案詳解
- 輻射防護復習題及答案
- 各種惡劣天氣行車安全培訓
- 化工裝置報廢拆除施工方案
- 華東理工大學《生物信息學》2021-2022學年第一學期期末試卷
- 《秦腔》課件統編版高中語文選擇性必修下冊
評論
0/150
提交評論