1、编译技术第5次上机内容编译技术第5次上机内容目的:充分理解语义分析的方法及相关语义计算的执行时机。要求:1以S属性的语法制导定义为基础,将下表的语义规则嵌套在语法分析的过程中,即实现语法制导的翻译过程。产 生 式 语 义 规 则 L E n print (E.val) E E1 + T E.val := E1 .val + T.val E T E.val := T.val T T1 * F T.val := T1.val * F.val T F T.val := F.val F (E) F.val := E.val F digit F.val := digit.lexval2以词法分析和语法分
2、析部分的上机结果为基础,添加语义分析部分。即以LR文法为基础。当进行产生式归约时执行对应的语义动作。3输入:5+3+8*2输出:244 若输入有误,如:3+2则应提示:重新输入!5 由于输入串是具体的数值,因此应调用相应的词法分析的功能。/ Expression.cpp : Defines the entry point for the console application./#include stdafx.h#include conio.h#include#include#includeusing namespace std;#define L 0#define E 1#define T
3、2#define E_ 3#define T_ 4#define F 6#define digit 7 / 数字#define add 8 / 左括号#define mul 9 / 右括号#define lb 10#define rb 11int nStackPtr;int Stack100; / 栈void guiyue(stack &state,stack &value,char nex);void Push(int n) nStackPtr +; StacknStackPtr = n;void Pop() nStackPtr-;void PrintStack() int i; for (
4、i = nStackPtr; i = 0; i-) if (Stacki = E) printf(E ); if (Stacki = E_ ) printf(E ); if (Stacki = T ) printf(T ); if (Stacki = T_ ) printf(T ); if (Stacki = F) printf(F ); if (Stacki = digit) printf(digit ); if (Stacki = add) printf(+ ); if (Stacki = mul) printf(* ); if (Stacki = lb) printf( ); if (S
5、tacki = rb) printf() ); printf(n);/ 利用栈来分析表达式串,判定表达式串是否正确/ /int main(int argc, char* argv) char strInput100; / 存放表达式串 bool bResult; int nInputPtr; nStackPtr = -1; nInputPtr = 0; bResult = true; / 输入表达式串,存放在 strInput中 printf(请输入表达式串:); scanf(%s,strInput); Push(E); PrintStack(); while (bResult & nStac
6、kPtr = 0) switch(StacknStackPtr) case E: if (strInputnInputPtr = 0 & strInputnInputPtr = 0 & strInputnInputPtr = 0 & strInputnInputPtr= 0 & strInputnInputPtr=9) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case add: if (strInputnInputPtr = +) Pop(); nInputPtr+; else bResult = false;
7、 PrintStack(); break; case mul: if (strInputnInputPtr = *) Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case lb: if (strInputnInputPtr = () Pop(); nInputPtr+; else bResult = false; PrintStack(); break; case rb: if (strInputnInputPtr = ) Pop(); nInputPtr+; else bResult = false; Print
8、Stack(); break; default: bResult = false; break; if (bResult = false) printf(表达式有问题了n); else printf(表达式没问题!n);/以上是词法、语法分析代码/-/以下是语义分析代码 stack state; stack value; int i=0; int size=strlen(strInput); for(i=0;i=0&strInputi=9) state.push(digit); value.push(strInputi-0); if(i!=(size-1) guiyue(state,value
9、,strInputi+1); else guiyue(state,value,#); else if(strInputi=+) state.push(add); else if(strInputi=*) state.push(mul); else if(strInputi=() state.push(lb); else if(strInputi=) state.push(rb); if(i!=(size-1) guiyue(state,value,strInputi+1); else guiyue(state,value,#); / printf(Hello World!n); return
10、0;void guiyue(stack &state,stack &value,char nex) int next; if(nex=0&nex=9) next=digit; else if(nex=#) next=0; else switch(nex) case +: next=add; break; case *: next=mul; break; case (: next=lb; break; case ): next=rb; break; stack state1=state; stack value1=value; int top_s1,top_s2; int top_v1; int
11、 top=state.top(); bool flag=true; while(flag) switch(state.top() case digit: state.pop(); state.push(F); state1=state; break; case F: if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=mul&top_s2=T) state1.push(T); state=state1; value1.po
12、p(); top_v1=value1.top(); value1.pop(); value1.push(top_v1*value.top(); value=value1; else state.pop(); state.push(T); state1=state; else state.pop(); state.push(T); state1=state; break; case T: if(next=mul) flag=false; else if(state.size()=3) state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=
13、state1.top(); state1.pop(); if(top_s1=add&top_s2=E) state1.push(E); state=state1; value1.pop(); top_v1=value1.top(); value1.pop(); value1.push(top_v1+value.top(); value=value1; else state.pop(); state.push(E); state1=state; else state.pop(); state.push(E); state1=state; break; case E: if(next=add|ne
14、xt=rb) flag=false; else if(state.size()=1&state.top()=E) state.pop(); state.push(L); printf(%dn,value.top(); exit(0); state1=state; break; case rb: state1.pop(); top_s1=state1.top(); state1.pop(); top_s2=state1.top(); state1.pop(); if(top_s1=E&top_s2=lb) state1.push(F); state=state1; state1=state; break;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1