else if(5==i) { strcpy(Mnemonic,\}
else if(6==i) { strcpy(Mnemonic,\}
else if(7==i) { strcpy(Mnemonic,\}
else if(8==i) { strcpy(Mnemonic,\}
else if(9==i) { strcpy(Mnemonic,\}
else if(10==i) { strcpy(Mnemonic,\}
else if(11==i) { strcpy(Mnemonic,\}
else if(12==i) { strcpy(Mnemonic,\}
else if(13==i) { strcpy(Mnemonic,\}
else if(14==i) { strcpy(Mnemonic,\}
else if(15==i) { strcpy(Mnemonic,\}
else if(16==i) { strcpy(Mnemonic,\ }
else if(17==i) { strcpy(Mnemonic,\ }
else if(18==i) { strcpy(Mnemonic,\ }
else if(19==i) { strcpy(Mnemonic,\ }
else if(20==i) { strcpy(Mnemonic,\ } else { strcpy(Mnemonic,\ }
printf(\ )对应 %s\\n\}
/////////////////////////////////////////////////报错 void report_error (int row) {
printf(\ 无法识别的单词! In the %d row\\n\}
/////////////////////////////////////////////////////////////扫描程序
void scanner(FILE *fp)//总的判断函数开始就应该判断已读取的字符是否为空字符,不为则不用再读,直接进行判断,否则再读 {
//printf(\ int i, c;
fseek(fp,-1,1);//首先回溯一个字符,就是将文件所有的字符都在scanner内部判断,外部while循环不会浪费任何字符
ch=fgetc (fp);//scanner中要想判断字符,必须开头先读一个字符 while(' '==ch||'\\n'==ch||'\\t'==ch)//将文件中的所有空字符浪费在这里 { if('\\n'==ch)
{ row++; } ch=fgetc (fp); }
if(EOF==ch) { return;
}//必须在这里判断一下 /*if(' '==ch||'\\n'==ch||'\\t'==ch) { fseek(fp,-1,1); return; }*/ //ch=fgetc (fp); /*if(' '==ch||'\\n'==ch||'\\t'==ch) { fseek(fp,-1,1); return;//文件结束标志不能与这几个空白符作为一种情况考虑,因为文件遇到结束标志时,不能回退 }//文件指针,否则在外层的while循环中造成死循环,由此猜测fgetc函数执行的过程为,先读取 */ //当前文件指针所指的字符,再将字符指针后移!
if (isalpha (ch)) /*it must be a identifer!*/ { TOKEN[0]=ch; ch=fgetc (fp); i=1; while (isalnum (ch)) { TOKEN[i]=ch; i++; ch=fgetc (fp); } TOKEN[i]= '\\0'; fseek(fp,-1,1); /* retract*/ c=lookup (TOKEN); if (c!=6) out (c+13,TOKEN); else out (c+14,TOKEN);//此处加13或者14因为一些常量的定义产生冲突,被迫修改以适应 }
else if(isdigit(ch)|| '.'==ch) { fseek (fp,-1,1);//首先回溯一个字符,下面为了循环内部使用先读字符后判
断的格式。 int Type;
CurrentState=0; i=0; do { ch=fgetc(fp); TOKEN[i]=ch; i++; TOKEN[i]='\\0';//为随时输出字符串做准备 Type=GetChar(ch); EXCUTE (CurrentState,Type,fp,TOKEN,row,i); }while(CurrentState!=EndState); /*TOKEN[0]=ch; ch=fgetc(fp); i=1; while(isdigit(ch)) { TOKEN[i]=ch; i++; ch=fgetc(fp); } TOKEN[i]= '\\0'; fseek(fp,-1,1); out(INT,TOKEN);*/
} else
switch(ch) { case '<': ch=fgetc(fp); if(ch=='=')out(LE,\ else if(ch=='>') out (NE,\ else { //fseek (fp,-1,1); out (LT,\ } break; case '=': { ch=fgetc(fp); if('='==ch) { out(EQ, \ } else
{ //fseek (fp,-1,1); out(IS, \ } } break;
case '>': ch=fgetc(fp); if(ch=='=')out(GE,\ else { //fseek(fp,-1,1); out(GT,\ } break; case '+': { InputWordType=PL; out(PL,\ } break; case '-': { InputWordType=MI; out(MI,\ } break; case '*': { InputWordType=MU; out(MU,\ } break; case '/': { InputWordType=DI; out(DI,\ } break; case '(': { InputWordType=LB; out(LB,\ } break;