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)表中没有标识符项,所以语法分析出错,语义分析终止, 继续分析下一语句。