附录c 编译程序实验 实验目的:用C语言编写一个简单语言子集的单遍扫描编译程序,以加深对编译原理的理解,掌握编译器的实现方法和技术程序。 语法分析 C2.1 实验目的是编写一个递归下降分析程序,对词法分析程序提供的词序列进行语法检查和结构分析。 C2.2实验要求用C语言编写递归下降分析程序并进行简单的语言分析。 句法分析。C2.2.1 待分析的简单语言语法实验的目的是通过计算机实践加深对语法引导翻译原理的理解,掌握将所识别的语法成分进行转换的语义翻译方法。语法分析成中间代码。 实验要求递归下降语法引导翻译方法对算术表达式和赋值语句进行语义分析并生成四元数序列。 实验的输入和输出是语法分析提供的正确单词串,输出是三地址指令形式的四进制序列。 例如:对于语句串begin a:=2+3*4;x:=(a+b)/c end#,三地址指令输出如下: (1) t1=3*4 (2 ) t2=2+t1 (3) a=t2 (4) t3=a+b (5) t4=t3/c (6) x=t4 算法思路1 设置语义过程 (1) emit(char *,char * arg1,char *op, char *ag2) 该函数的作用是生成一个三地址语句并发送给四元数表。
四元数表的结构如下: {char[8];char ag1[8];char op[8];char ag2[8];}quad[20];(2)char *() 该函数返回a new 临时变量名按照T1,T2,…的顺序生成。Char *(void){char *p;char m[8];p=(char *)(8);k++;itoa(k, m,10);(p+1,m);p[0]='t';(p);}(2) 主程序示意图如图c.10所示。 (2)函数根据原始语法分析插入相应的语义动作:将输入字符串翻译成四元数序列。 在实验中,我们只翻译了表达式和赋值语句。 语义分析程序的C语言程序框架 int (){ int =0;kk=0;if(syn=1){ 读取下一个单词符号; =雨醋; /调用语句字符串分析函数进行分析/if(syn=6 ){ 读取下一个字符号; if(syn=0 && (kk==0)) 输出 ("");}else { if(kk!=1) 输出 ' end' 错误; kk=1;}else {输出'开始'错误; kk=1;}}();int yucu(){ int =0;=();/调用语句分析函数进行分析/while(syn=26){读取下一个单词符号; =(); /调用语句分析函数进行分析/}();}int (){ char tt[8],[8];int =0;{(syn){case 10:(tt,token);( );if (syn=18){读取下一个字符号;(,());emit(tt,,"","");=0;}else {输出'缺少赋值号'的错误;kk= 1; }();break;}}char *(void){char *tp,*ep2,*,*tt;tp=(char *)(12);/分配空间/ep2=(char *)(12 ); =(char *)(12);tt =(char )(12);(,term ());/调用项分析生成表达式第一项计算/while(syn=13 or 14){ 运算符号 tt =“+”或“—”; 读出下一个单词符号; (ep2,术语()); / 调用项分析生成表达式计算的第二项 ep2 / (tp, ()); / 调用生成临时变量tp存储计算结果/emit(tp,,tt,ep2);/生成四元表达式并发送给四元数表/(,tp);}();}char *term(void) /写在函数后面/char *(void){char *;=(char *)(12);(, “ ”);if(syn=10){(,,token);/分配标识符的值token 到/读取下一个字符号;}else if(syn=11){itoa(sum,,10);读取下一个字符号;}else if (syn=27){读取下一个字符号;=() ;/调用分析返回表达式/if(syn=28)的值读取下一个字符号; else{输出'}'错误; kk=1;}}else{输出'('错误;kk=1;}();}