《编译原理之语义分析》由会员分享,可在线阅读,更多相关《编译原理之语义分析(23页珍藏版)》请在金锄头文库上搜索。
1、编译原理之语义分析(Semantic analysisof compilerprinciples)/ / 语义分析源代码/ / function a = 2 + 3 * 4; x = (a + b) / c; endfunc # include # include # include # include # include struct quadchar result 12; char ag1 12; char op 12; char ag2 12; ;struct quad quad 30;int count = 0;char * expression (void);char prog 20
2、0, token 8;char ch;int syn, p, m, n, sum = 0, y = 0, mm = 0;char * rwtab 6 = function, if, then, while, do, endfunc;from scaner ()m = 0;for (n = 0; n = a & & ch = z) | | (ch = a)while (ch = a & & ch = z) | | (ch = a), | | (ch = 0 & & ch = 9)token m + + = ch;ch = prog p + +;token m + + = 0;p - - - -
3、- - - -;syn = 10;for (n = 0; n = 0 & & ch = 0 & & ch = 9)sum = sum * 10 + ch - 0);ch = prog p + +;p - - - - - - - -;syn = 11;elseswitch (ch)case means:m = 0;token m + + = ch;ch = prog + + p;if (ch = = =)syn = 24;token m + + = ch;elsesyn = 23;ch = prog - p;break;case =:m = 0;token m + + = ch;ch = pro
4、g + + p;if (ch = = =)syn = 25;token m + + = ch;elsesyn = 18;ch = prog - p;break;case ! :m = 0;token m + + = ch;ch = prog + + p;if (ch = = =)syn = 22;token m + + = ch;elsesyn = - 1;break;case +: syn = 13; token 0 = ch; break;case -: syn = 14; token 0 = ch; break;case *: syn = 15; token 0 = ch; break;
5、case /: syn = 16; token 0 = ch; break;case ;: syn = 26; token 0 = ch; break;case (): syn = 27; token 0 = ch; break;case ): syn = 28; token 0 = ch; break;case #: syn = 0; token 0 = ch; break;default: syn = - 1;/ / ch = prog p + +;from emit (char * result, char * ag1, char * op, char * ag2)strcpy (qua
6、d count.result, result); strcpy (quad count.ag1, ag1); strcpy (quad count.op, op); strcpy (quad count.ag2, ag2); count + +;return;char * newtemp ()char * p;char m 8;p = (char *) malloc (8);c + +;itoa (k, m, 10);strcpy (p + 1, m);p 0 = t;return (p);char * factor (void)char * fplace;fplace = (char *)
7、malloc (12);strcpy (fplace, );if (syn = = 10)strcpy (fplace, token);scaner ();else if (syn = = 11)itoa (sum, fplace, 10);scaner ();else if (syn = = 27)scaner ();fplace = expression ();if (syn = = 28)scaner ();elseprintf ( n) 错误 );kk = 1;elseprintf ( n (错误 );kk = 1;return (fplace);char * term (void)char * tp, * wp2, * eplace, * tt;tp = (char *) malloc (12);wp2 = (char *) malloc (12);eplace = (char *) malloc (12);tt = (char *) malloc (12); strcpy (eplace, factor ();while (syn = = 15 | | vision = = 16)if (syn = = 15)tt 0 = *; tt 1 = 0;else if (syn = = 16)