编译原理语义分析程序设计
实验3语义分析程序设计 【实验目的】 加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻 译方法。 【实验内容】 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。 【设计思路】 1、流程图 置初值 调用scaner读下一个单词符号 调用 Irparser 输出四元式 〔结束J 图2.1递归下降分析程序示意图 2、源程序代码 1 scan.h〃头文件扫描程序 includestdio.h includestring.h char prog[80],token [8]; char ch; int syn,p,m,n,sum;//p是缓冲区prog的指针,m是token的指针 char *rwtab[6],begin,,;,if,then,while,ndon,end}; void scanner〃词法扫描程序 { memsettoken,\0,sizeoftoken;〃清空数组 token m0; whilech * { p;chprog[p];〃读下一个字符; } ifchachvzllchAchvZ m0; whilech,a,ch,z,llch,A,ch,Z,llch,0,ch,9, token [m]ch; p;chprog[p];// 读下一个字符; } token [m]*\0; syn10; forn0;n6;n ifstrcmptoken,rwtab[n]0 { synnl; break; } } else ifch0chv9 sum0; whilech0chv9 { sumsum*10ch-0‘;〃将 ch 转换为数字 P; chprog[p]; } synll; } else switchch//其他字符情况 casev m0;token [m]ch; P; chprog[p]; ifch,, { syn21; m; token[m]ch; } else ifch syn22; m; token[m]ch; } else syn20; break; case token [O]ch; P; chprog[p]; ifch syn24; token [0]ch; } else { syn23; } break; case token [0]ch; P; chprog[p]; ifch syn18; m; token [m]ch; P; chprog[p]; } else syn17; } break; case* syn13;token[0]ch;chprog[p]; break; case-* syn14;token[0]ch;chprog[p]; break; case* syn 15 ;token[0]ch;chprog[p]; break; case/ syn 16;token[0]ch;chprog [p]; break; case syn25; token [O]ch;chprog[p]; break; case; syn26 ;token [0]ch;chprog [p]; break; caseC syn27 ;token [0]ch;chprog [p]; break; case syn28;token[0]ch;chprog[p]; break; case syn0; token[0] ch;chprog[p]; break; default syn-l; } } 2 yuyi.cpp //语法分析主程序 includestdlib.h includeMscan.h int kk0,q0,k0; struct { char result[8]; char agl[8]; char op[8]; char ag2[8]; }quad[20]; int lrparser; int yucu; int statement; char * expressionvoid; char * term; char * factor; char * newtempvoid; void emitchar *result,char *agl,char *op,char *ag2; void main { kk0; rewindstdin; memsetprog,\0,sizeofprog;//清空数组 prog P0; printfH\n please stringAn; do chgetchar; prog[p]ch; }whilech *; P0; chprog[0]; scanner; lrparser; forint i0;ivq;i { printfssss\n,quad[i].result,quad[i].agl,quad[i].op,quad[i].ag2; } int lrparser { int schain0; kk0; iflsyn scanner; schainyucu; if6syn { scanner; ifOsynllOkk printfsuccess\n; } } else { ifkkl printfn缺 endn;kkl; } else printf缺 begin;kkl; } return schain; int yucu〃语句串分析函数 { int schainO; schainstatement; while26syn { scanner; schainstatement; } return schain; int statement { char tt[8]