#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define _KEY_WOED_END "waiting for your expanding" //关键字结束标志
typedef
struct
{
int
typenum;
char
* word;
}
WORD
;
char
input[255];
char
token[255]=
""
;
int
p_input;
int
p_token;
char
ch;
char
*rwtab[]={
"begin"
,
"if"
,
"then"
,
"while"
,
"do"
,
"end"
,_KEY_WOED_END};
WORD
* scaner();
main()
{
int
over=1;
WORD
*oneword;
oneword=(
WORD
*)
malloc
(
sizeof
(
WORD
));
printf
(
"请输入您的字符串(以#作为结束标志):"
);
scanf
(
"%[^#]s"
,input);
p_input=0;
printf
(
"您输入的字符串是:%s
"
,input);
while
(over<1000&&over!=-1)
{
oneword=scaner();
printf
(
"(%d,%s)
"
,oneword->typenum,oneword->word);
over=oneword->typenum;
}
printf
(
"
备注:数字10代表所输入的不是关键词,只是普通词
"
);
printf
(
" 数字20代表您输入的是数字
"
);
printf
(
" 数字1000是结束标志
"
);
}
char
m_getch(){
ch=input[p_input];
p_input=p_input+1;
return
(ch);
}
void
getbc()
{
while
(ch==
' '
||ch==10){
ch=input[p_input];
p_input=p_input+1;
}
}
void
concat()
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]=
' '
;
}
int
letter()
{
if
(ch>=
'a'
&&ch<=
'z'
||ch>=
'A'
&&ch<=
'Z'
)
return
1;
else
return
0;
}
int
digit()
{
if
(ch>=
'0'
&&ch<=
'9'
)
return
1;
else
return
0;
}
int
reserve()
{
int
i=0;
for
(i=0;i<7;i++)
{
if
(!
strcmp
(rwtab[i],token))
{
return
i+1;
}
i=i+1;
}
return
10;
}
void
retract()
{
p_input=p_input-1;
}
WORD
*scaner()
{
WORD
*myword;
myword=(
WORD
*)
malloc
(
sizeof
(
WORD
));
myword->typenum=10;
myword->word=
""
;
p_token=0;
m_getch();
getbc();
if
(letter())
{
while
(letter()||digit())
{
concat();
m_getch();
}
retract();
myword->typenum=reserve();
myword->word=token;
return
(myword);
}
else
if
(digit())
{
while
(digit())
{
concat();
m_getch();
}
retract();
myword->typenum=20;
myword->word=token;
return
(myword);
}
else
{
switch
(ch)
{
case
'='
:m_getch();
if
(ch==
'='
)
{
myword->typenum=39;
myword->word=
"=="
;
return
(myword);
}
retract();
myword->typenum=21;
myword->word=
"="
;
return
(myword);
break
;
case
'+'
:
myword->typenum=22;
myword->word=
"+"
;
return
(myword);
break
;
case
'-'
:
myword->typenum=23;
myword->word=
"-"
;
return
(myword);
break
;
case
'*'
:
myword->typenum=24;
myword->word=
"*"
;
return
(myword);
break
;
case
'/'
:
myword->typenum=25;
myword->word=
"/"
;
return
(myword);
break
;
case
'('
:
myword->typenum=26;
myword->word=
"("
;
return
(myword);
break
;
case
')'
:
myword->typenum=27;
myword->word=
")"
;
return
(myword);
break
;
case
'['
:
myword->typenum=28;
myword->word=
"["
;
return
(myword);
break
;
case
']'
:
myword->typenum=29;
myword->word=
"]"
;
return
(myword);
break
;
case
'{'
:
myword->typenum=30;
myword->word=
"{"
;
return
(myword);
break
;
case
'}'
:
myword->typenum=31;
myword->word=
"}"
;
return
(myword);
break
;
case
','
:
myword->typenum=32;
myword->word=
","
;
return
(myword);
break
;
case
':'
:
myword->typenum=33;
myword->word=
":"
;
return
(myword);
break
;
case
';'
:
myword->typenum=34;
myword->word=
";"
;
return
(myword);
break
;
case
'>'
:
myword->typenum=35;
myword->word=
">"
;
return
(myword);
break
;
case
'<'
:
myword->typenum=36;
myword->word=
"<"
;
return
(myword);
break
;
case
'!'
:
m_getch();
if
(ch==
'='
)
{
myword->typenum=40;
myword->word=
"!="
;
return
(myword);
}
retract();
myword->typenum=-1;
myword->word=
"ERROR"
;
return
(myword);
break
;
case
' '
:
myword->typenum=1000;
myword->word=
"OVER"
;
return
(myword);
break
;
default
:
myword->typenum=-1;
myword->word=
"ERROR"
;
return
(myword);
}
}
}