?? 2.cpp
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getch();
void getsym();
typedef struct tag_keywordarray /* 存放關鍵字 */
{
char a[20];
}keywordarray[10];
typedef struct tag_token /* 存放種別碼和值的 */
{
int sym;
char symbol[10];
}token[100];
keywordarray keyword={ "begin","end","for","if","integer","procedure","read",
"repeat","var","write"};
static token token_PL;
static int cc=0;
static int j=0;
static char line[50];
char ch;
bool RLP=true;
void main(void)
{
int i;
getsym();
for(i=0;i<j;i++)
{
printf("<");
printf("%d,",token_PL[i].sym);
printf("%s> ",token_PL[i].symbol);
}
if(RLP==false)
{
printf("\nNone of ')'\n");
}
system("pause");
}
void getsym()
{
int k;
int i;
char A[10];
char id[10];
while(ch==NULL)
{
getch();
}
/* 判斷ch是否有字 */
while(ch!='\n')
{
if((ch>='A' && ch<='Z') || (ch>='a' && ch<='z'))
/* 判斷取出的字是否為字母 */
{
k=0;
A[k]=ch;
k=k+1;
getch();
while(1)
{
if((ch>'A' && ch<'Z') || (ch>='a' && ch<='z' )||(ch>='0' && ch<='9'))
{
if(k<10)
{
A[k]=ch;
k=k+1;
getch();
}
else
{
getch();
/* k>10則繼續取詞,但對后面的不錯處理,截取前10個 */
}
}
else
{
cc-=1;
break;
}
}
for(i=0;i<k;i++)
{
id[i]=A[i];
}
id[i]='\0';
bool bKeyword=false;
for(i=0;i<10;i++)
{
if((stricmp(id,keyword[i].a))==0)
{
token_PL[j].sym=1;
strcpy(token_PL[j].symbol,keyword[i].a);
j=j+1;
bKeyword=true;
break;
}
}
if(!bKeyword)
{
token_PL[j].sym=2;
strcpy(token_PL[j].symbol,id);
j=j+1;
}
}
else
{
if(ch>='0' && ch<='9') /* 判斷是否為數字 */
{
k=0;
A[k]=ch;
k=k+1;
getch();
while(1)
{
if(ch>='0' && ch<='9')
{
if(k<10)
{
A[k]=ch;
k=k+1;
getch();
}
else
{
getch();
}
}
else
{
cc-=1;
break;
}
}
token_PL[j].sym=4;
A[k]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else /* 是否為操作符 */
{
if(ch=='+')
{
k=0;
A[k]=ch;
token_PL[j].sym=3;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch=='-')
{
k=0;
A[k]=ch;
token_PL[j].sym=3;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch=='*')
{
k=0;
A[k]=ch;
token_PL[j].sym=3;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch=='/')
{
k=0;
A[k]=ch;
token_PL[j].sym=3;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch==':')
{
k=0;
A[k]=ch;
getch();
if(ch=='=')
{
k=k+1;
A[k]=ch;
}
token_PL[j].sym=3;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch=='"')
{
k=0;
A[k]=ch;
token_PL[j].sym=5;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
}
else if(ch=='(')
{
k=0;
A[k]=ch;
token_PL[j].sym=5;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
RLP=false;
}
else if(ch==')')
{
k=0;
A[k]=ch;
token_PL[j].sym=5;
A[k+1]='\0';
strcpy(token_PL[j].symbol,A);
j=j+1;
RLP=true;
}
}
}
getch();
}
}
void getch()
{
if(line[0]==NULL)
/* 如果緩沖中第一個位置為空的話,就認為未有語句輸入 */
{
int i=-1;
do
{
i++;
scanf("%c",&line[i]);
}while(line[i]!='\n');
}
ch=line[cc]; /* 取出一詞 */
cc=cc+1;
} /* cc該聲明為static比較好 */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -