/*需要的库和全局变量、函数及主程序*/
#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(); //词法扫描函数,获得一个单词
char m_getch();
int 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);
return 0;
}
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] = '\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())
{
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 '>': 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);
break;
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 = 1000;
myword->word = "OVER";
return (myword);
}
}
词法分析
最新推荐文章于 2024-01-30 08:52:48 发布