天津理工大学编译原理实验3:语义分析及中间代码生成 联系客服

发布时间 : 星期日 文章天津理工大学编译原理实验3:语义分析及中间代码生成更新完毕开始阅读aec879ababea998fcc22bcd126fff705cc175ccc

p--; char second=state_stack[p]; int i=getraw(second); int j=getcol('T'); char c_out=getraw_content(table[i][j]); cout<<\用T-->F规约且\ popstack(state_stack,pointer_state,1); popstackc(stack,pointer,1); char c='T';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); stack[(*pointer)].endchar=s;//将记录下的变量赋值给规约后的字符 }

else if(production==\ { int po=(*pointer);//用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 string sf=stack[po].endchar;//对应 F po-=2; string sp=stack[po].endchar;//在规约之前记录下要规约的字符所代表的变量。对应 P tsize++;//新增临时变量 t[tsize].num=tsize+1;//下面四个表达式是按照上面的规约式进行的赋值 t[tsize].operate='^'; t[tsize].var1=sp; t[tsize].var2=sf; cout<<\ int p=(*pointer_state); p-=3; char second=state_stack[p]; int i=getraw(second); int j=getcol('F'); char c_out=getraw_content(table[i][j]); cout<<\用F-->P^F规约且\ popstack(state_stack,pointer_state,3); popstackc(stack,pointer,3); char c='F';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); string s=get_tx(t[tsize].num); stack[(*pointer)].endchar=s;//把保存P^F规约的结果的变量保存至当前字符的终结符 }

else if(production==\ {

int p=(*pointer_state); p--; char second=state_stack[p]; int i=getraw(second); int j=getcol('F'); char c_out=getraw_content(table[i][j]); cout<<\用F-->P规约且\ string s=stack[(*pointer)].endchar;//在规约之前记录下要规约的字符所代表的变量 popstack(state_stack,pointer_state,1); popstackc(stack,pointer,1); char c='F';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); stack[(*pointer)].endchar=s;//将记录下的变量赋值给规约后的字符 }

else if(production==\ { int p=(*pointer_state); p-=3; char second=state_stack[p]; int i=getraw(second); int j=getcol('P'); char c_out=getraw_content(table[i][j]); cout<<\用P-->(E)规约且\ int po=(*pointer);//用P规约该表达式,有效变量在E的endchar中,需要找到E的位置,即下面的操作 po--; string s=stack[po].endchar;//在规约之前记录下要规约的字符所代表的变量 popstack(state_stack,pointer_state,3); popstackc(stack,pointer,3); char c='P';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); stack[(*pointer)].endchar=s;//将记录下的变量赋值给规约后的字符 }

else if(production==\ { int p=(*pointer_state); p--; char second=state_stack[p]; int i=getraw(second);

int j=getcol('P'); char c_out=getraw_content(table[i][j]); cout<<\用P-->i规约且\ popstack(state_stack,pointer_state,1); popstackc(stack,pointer,1); char c='P';//str[(*index)]; pushstack(stack,pointer,state_stack,pointer_state,c,c_out,1); stack[(*pointer)].endchar=\ }

else if(production==\ { cout<<\分析成功\ (*index)++; } }

int main() {

char str[size];//接受字符串的数组 char_stack stack[size];//进行比对的栈 int pointer=-1;//指向栈顶的指针 int length=0;//记录字符串长度 int index=0;//记录输入字符串 char top;

char state_stack[size];//状态栈 int pointer_state=-1;//状态栈指针 int i,j;//i表示行,j表示列 string production; bool match=false;

cout<<\ cin>>str;

length=getLength(str); str[length]='#'; str[length+1]='\\0'; pointer++;

stack[pointer].content='#'; pointer_state++;

state_stack[pointer_state]='0';

cout<<\步骤\\t状态栈\\t符号栈\\t当前符号\\t输入串\\t四元式\\t\\t说明\ while(str[index]!='\\0') { top=gettop(state_stack,pointer_state);//获取状态栈栈顶元素 i=getraw(top); j=getcol(str[index]); production=table[i][j]; switch_method(stack,&pointer,state_stack,&pointer_state,production,str,&index);

}

return 0; }

上面的运行结果是根据文法产生的下面的语法树的语句