#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_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_WORD_END};
WORD* scaner();
void main(){
int over = 1;
WORD* oneword = new WORD;
printf("Enter Your words(end with #):");
scanf("%[^#]s",input);
p_input = 0;
printf("Your words:\n%s\n",input);
while (over<1000&&over!=-1)
{
oneword = scaner();
if(oneword->typenum<1000)
printf("(%d,%s)",oneword->typenum,oneword->word);
over = oneword->typenum;
}
printf("\npress # to exit");
scanf("%[^#]s",input);
}
//从输入缓冲区读取一个字符到ch
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 contact(){
token[P_token] = ch;
P_token = P_token + 1;
token[P_token] = '\0';
}
//判断是否为字母
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;
while (strcmp(rwtab[i],_KEY_WORD_END))
{
if (!strcmp(rwtab[i],token))
{
return i + 1;
}
i = i+1;
}
return 10;
}
//回退一个字符
void retract(){
p_input = p_input - 1;
}
//数字转换为二进制
char* dtb(){
return NULL;
}
WORD* scaner(){
WORD* myword = new WORD();
myword->typenum = 10;
myword->word = "";
P_token = 0;
m_getch();
getbc();
if (letter())
{
while (letter()||digit())
{
contact();
m_getch();
}
retract();
myword->typenum = reserve();
myword->word = token;
return(myword);
}
else if (digit())
{
while (digit())
{
contact();
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 '>' : m_getch();
if (ch == '=')
{
myword->typenum = 37;
myword->word = ">=";
return (myword);
}
retract();
myword->typenum = 35;
myword->word = ">";
return(myword);
break;
case '<' : m_getch();
if (ch == '=')
{
myword->typenum = 38;
myword->word = "<=";
return (myword);
}
retract();
myword->typenum = 36;
myword->word = "<";
return(myword);
case '!' : m_getch();
if (ch == '=')
{
myword->typenum = 40;
myword->word = "!=";
return (myword);
}
retract();
myword->typenum = -1;
myword->word = "ERROR";
return(myword);
break;
case '\0':myword->typenum = 1000;
myword->word = "OVER";
return(myword);
break;
default: myword->typenum = -1;
myword->word = "ERROR";
return(myword);
}
}
词法分析
最新推荐文章于 2022-10-04 22:40:57 发布