?? 3.cpp
字號(hào):
}
else
{
value = InsertConst(wordget); //將str串以常數(shù)插入符號(hào)表,并返回常數(shù)表指針
pDu->kind = CONST;
pDu->value = value;
}
return true;
//字符常量
case '\'':
wordget[i++] = ch; // '
GetChar(); //獲得一個(gè)字符不包括結(jié)束標(biāo)記
wordget[i++] = ch;
if(ch == '\\') // '\n'
{//如果是轉(zhuǎn)義字符則要多接收一個(gè)字符
GetChar(); // ch = '
wordget[i++] = ch;
}
GetChar();
wordget[i++] = ch;
wordget[i] = '\0';
if(ch != '\'')
{//'\b'
printf("%s",wordget);
ProcError(2);
pDu->kind = ERROR;
pDu->value = 0;
}
else
{
value = InsertConst(wordget);//將str串以常數(shù)插入符號(hào)表,并返回常數(shù)表指針
pDu->kind = CONST;
pDu->value = value;
}
return true;
case '(':
case ')':
case '[':
case ']':
case '.':
case ',':
case '~':
case '?':
case ':':
case ';':
case '{':
case '}':
case '#':
wordget[i++] = ch; wordget[i] = '\0';
pDu->kind = DIVIDE; //界符
pDu->value = -1;
return true;
case '!':
//!=
wordget[i++] = ch;
GetChar();//獲得一個(gè)字符不包括結(jié)束標(biāo)記
if (ch=='=') wordget[i++] = ch;
else Retract(); //將搜索指示器回調(diào)一個(gè)字符位置
wordget[i]='\0';
break;
case '<':
// << <=
wordget[i++] = ch;
GetChar();
if (ch == '<' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '>':
// >> >=
wordget[i++] = ch;
GetChar();
if (ch == '>' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '=':
// ==
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '&':
// && &=
wordget[i++] = ch;
GetChar();
if (ch == '&' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '|':
// || |=
wordget[i++] = ch;
GetChar();
if (ch == '|' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '+':
// ++ +=
wordget[i++] = ch;
GetChar();
if (ch == '+' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '-':
// -- -= ->
wordget[i++] = ch;
GetChar();
if (ch == '-' || ch == '=' || ch == '>') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '*':
// ** *=
wordget[i++] = ch;
GetChar();
if (ch == '*' || ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '/':
// /=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '%':
// %=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '^':
// ^=
wordget[i++] = ch;
GetChar();
if (ch == '=') wordget[i++] = ch;
else Retract();
wordget[i]='\0';
break;
case '\0':
return false;
default:
ProcError(1);
return false;
}
pDu->kind = OPERAT;
return true;
}
int main()
{
Dualistic tmp;
pDualistic ptmp = &tmp;
FILE *fin, *fout;
int i;
char c;
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★ ★\n");
printf("\t\t★ 詞法分析器 ★\n");
printf("\t\t★ ★ \n");
printf("\t\t★ 班級(jí): 計(jì)算計(jì)05-3班 ★ \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\t\t \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★ ★ \n");
printf("\t\t★ 楊倩 學(xué)號(hào): 0504030338 ★\n");
printf("\t\t★ 張文明 學(xué)號(hào): 0504030446 ★\n");
printf("\t\t★ ★\n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\n\n ***************************\n");
printf(" \t\t\t 讀入要分析的詞法\n");
if ((fin=fopen("Test.c","r")) == NULL)
{
printf("Cannot open infile\n");
return 0;
}
i = 0;
while((c = fgetc(fin)) != EOF)//fgetc文件中所有的數(shù)據(jù)(包括'\0')都是一樣處理,除非讀到了末尾,它就返回一個(gè)特殊值EOF
{
if(i >= PRO_MAX_LEN-1) // PRO_MAX_LEN 源程序最大長度
{
printf("\n程序代碼太長,無法處理\a");
return 0;
}
proBuffer[i++] = c;
}
fclose(fin); //關(guān)閉文件
proBuffer[i++] = '\0';
printf("\t\t ***************************\n詞法讀入成功,如下所示:\n%s",proBuffer);
printf("\n請(qǐng)按任意鍵繼續(xù)\n"); getch();
//預(yù)處理
printf("\n*****************************\n");
printf("\n 預(yù)處理\n");
pretreatment();//預(yù)處理函數(shù)
printf("\n*****************************\n預(yù)處理成功,去掉注釋后的詞法為:\n%s*",proBuffer);
printf("\n請(qǐng)按任意鍵繼續(xù)\n");
getch();// 所謂的按任意鍵繼續(xù)
printf("\n*****************************\n");
printf("\n 詞法分析\n");
printf("\n*****************************\n");
point = 0;
//詞法分析
if ((fout=fopen("Result.txt","wb")) == NULL)
{
printf("建立文件Result.txt失敗。\n");
return 0;
}
i = 0;
errorLine = 0; //錯(cuò)誤行歸零
do
{
if(i++ > PRO_MAX_LEN)//防止遇到BUG 導(dǎo)致程序死循環(huán)無限寫文件
break;
if(!wordAnalyse(ptmp))
{
break;
}
if (ptmp->value == -1)
fprintf(fout, "<%3d, ->\t",ptmp->kind);
else
fprintf(fout, "<%3d,%3d>\t",ptmp->kind, ptmp->value);
switch(ptmp->kind)
{
case ERROR:
fprintf(fout, "(出 錯(cuò):%s)",wordget);
break;
case ID:
fprintf(fout, "(標(biāo)識(shí)符:%s)",wordget);
break;
case CONST:
fprintf(fout, "(常 量:%s)",wordget);
break;
case OPERAT:
fprintf(fout, "(運(yùn)算符:%s)",wordget);
break;
case DIVIDE:
fprintf(fout, "(界 符:%s)",wordget);
break;
default:;
}
if(ptmp->kind >= 5 && ptmp->kind <= KEYWORD_LEN)
fprintf(fout, "(關(guān)鍵字:%s)",kwTab[ptmp->kind-5]);
fprintf(fout, "\r\n");
}while(1);
fclose(fout);
printf("寫回常量表和標(biāo)識(shí)符表\n");
//常量表
if ((fout=fopen("Const.txt","wb")) == NULL)
{
printf("建立文件Const.txt失敗。\n");
return 0;
}
for(i = 0; i < pointCTB; ++i)
fprintf(fout, "%3d %s\r\n",i, constTab[i]);
fclose(fout);
//標(biāo)識(shí)符表
if ((fout=fopen("Sign.txt","wb")) == NULL)
{
printf("建立文件Sign.txt失敗。\n");
return 0;
}
for(i = 0; i < pointSTB; ++i)
fprintf(fout, "%3d %s\r\n",i, signTab[i]);
fclose(fout);
printf("\n寫入完畢\n按任意鍵繼續(xù)\n"); getch();
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -