📄 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 + -