词法分析

来源:互联网 发布:tl494引脚功能和数据 编辑:程序博客网 时间:2024/04/28 23:16
/*需要的库和全局变量、函数及主程序*/#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);}}


0 0
原创粉丝点击