词法、语法、语义分析结合(4)

2019-04-01 22:47

int ProductionNum=atoi(&Action[TopState][InputWordType][1]); int ProdutionLeft=0; if (1==ProductionNum) { ProdutionLeft=E;//为下面差goto表提供列坐标 Pop(3); printf(\用产生式 1 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(E_Place,Temp); printf(\生成四元式:(“+”,E_Place,T_Place,E_Place)\\n\ }

else if(2==ProductionNum) { ProdutionLeft=E; Pop(3); printf(\用产生式 2 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(E_Place,Temp); printf(\生成四元式:(“-”,E_Place,T_Place,E_Place)\\n\ }

else if(3==ProductionNum) { ProdutionLeft=E; Pop(1); printf(\用产生式 3 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(E_Place,Temp); printf(\生成四元式:(-,-,T_Place,E_Place)\\n\ }

else if(4==ProductionNum) { ProdutionLeft=T; Pop(3); printf(\用产生式 4 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(T_Place,Temp); printf(\生成四元式:(“*”,T_Place,F_Place,T_Place)\\n\ }

else if(5==ProductionNum) {

ProdutionLeft=T; Pop(3); printf(\用产生式 5 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(T_Place,Temp); printf(\生成四元式:(“/”,T_Place,F_Place,T_Place)\\n\ } else if(6==ProductionNum) { ProdutionLeft=T; Pop(1); printf(\用产生式 6 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(T_Place,Temp); printf(\生成四元式:(-,-,F_Place,T_Place)\\n\ } else if(7==ProductionNum) { ProdutionLeft=F; Pop(3); printf(\用产生式 7 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(F_Place,Temp); printf(\生成四元式:(-,-,(E)_Place,F_Place)\\n\ } else if(8==ProductionNum) { ProdutionLeft=F; Pop(1); printf(\用产生式 8 归约\\n\ char* Temp=NewTemp(); GEN(\ strcpy(F_Place,Temp); printf(\生成四元式:(-,-,i_Place,F_Place)\\n\ } else { printf(\分析语句 %i 时产生式编号超出范围!分析结束\\n\ return 0; }

Push(Goto[TopState][ProdutionLeft]); // }while('r' == Action[TopState][InputWordType][0]) } }

printf(\栈顶状态:%i\\n\

printf(\扫描的单词类型:%i\\n\

printf(\语句 %i 正确*********************************\\n\ return 1; }

/////////////////////////////////状态栈的压栈和出栈程序 int Push( int State ) {

if (SMAX==StackPoint) { printf(\状态栈已满!\ return 0; }

StateStack[StackPoint]=State; StackPoint++;

TopState=State;//用topstate存储当前栈顶状态 return 1; }

int Pop(int count) //内部要把处理完的数组的顶部的值赋给topstate {

StackPoint=StackPoint-count; if (StackPoint<0) { printf(\状态栈指针不能为负值!\ return 0; }

TopState=StateStack[StackPoint-1]; return 1; }

//////////////////////////////////////语法分析部分

void GEN(char *Op, char *Arg1, char *Arg2, char *Result) {

strcpy (pQuad[NXQ].op, Op); /*pQuad为全局变量,是用于存放四元式的数组*/

strcpy (pQuad[NXQ].arg1, Arg1);

strcpy (pQuad[NXQ].arg2, Arg2); strcpy (pQuad[NXQ].result, Result);

NXQ++; /*全局变量NXQ用于指示所要产生的下一个四元式的编号*/ }

char *NewTemp(void) /*产生一个临时变量*/ {

char *TempID=(char*)malloc(PMAX); sprintf (TempID, \ return TempID; }

void NextSentence(FILE* fp) {

while ('#' != ch) { ch=fgetc(fp); }

SentenceCount++; return; }

/////////////////////////////////主程序 int main(int argc, char* argv[]) {

printf(\

//char c;

char pStr[20]; scanf(\

//printf(\ FILE *p=fopen(pStr,\ //ch=fgetc(p);

if(ch=fgetc(p)==EOF)//不管小括号内的判断是否成功,p指针都会向后移一个位置,判断不成功,ch中存的字符不变 { printf(\ return 0; } do { TopState=0;

StackPoint=0; memset(StateStack,-1,sizeof(StateStack)); printf(\语句 %i 分析开始**************************\\n\ scanner(p); SLRControl(p); NextSentence(p);

} while (EOF!=fgetc(p));

// printf(\第一个字母是:%c\\n\

//fseek(p,-1,1); /*do { scanner(p);

}while(ch=fgetc(p)!=EOF);*/ fclose(p); return 0; }

六、测试用例及运行结果分析 测试用例1: 1.5E-2+100 # 1+2#

运行结果1:

测试用例2:

1.5E-2+100 +abc# 1+2#

运行结果2:

结果分析:

语法分析的slr(1)表中没有标识符项,所以语法分析出错,语义分析终止, 继续分析下一语句。


词法、语法、语义分析结合(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:区分间接故意与过于自信的过失的客观标准

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: