实验目的
设计、编制并调试一个词法分析程序, 加深对词法分析原理的理解
代码
#include <stdio.h>
#include <stdlib.h> //related library
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct{
int typenum; //Signture
char* word; //corresponding string
}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* scanner();
void main(){
int over = 1;
WORD* oneword = malloc(sizeof(WORD)); //error 01
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 = scanner();
if(oneword->typenum < 1000){
printf("(%d, %s)", oneword->typenum, oneword->word);
}
over = oneword->typenum;
}
printf("\npress#to exit:");
scanf("%[^#]s", input);
}
/* return a character*/
char m_getch(){
ch = input[p_input];
p_input = p_input + 1;
return (ch);
}
/*filter space and newline character*/
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] = '\x0';
}
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;
}
}
/*reverse a string*/
int reserve(){
int i = 0;
while(strcmp(rwtab[i], _KEY_WORD_END)){
if(!strcmp(rwtab[i], token)){
return i+1;
}
i++;
}
return 10;
}
void retract(){
p_input = p_input - 1;
}
char* dtb(){
return NULL;
}
WORD* scanner(){
WORD* myword = malloc(sizeof(WORD)); //error
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 = 11;
myword -> word = token;
return (myword);
} else {
switch(ch){
case '=': /* continuous equal sign*/
myword -> typenum = 25;
myword -> word = "=";
return (myword);
case '+':
myword -> typenum = 13;
myword -> word = "+";
return (myword);
case '-':
myword -> typenum = 14;
myword -> word = "-";
return (myword);
case '*':
myword -> typenum = 15;
myword -> word = "*";
return (myword);
case '/': //对多行注释的的实现
m_getch();
if(ch == '*'){
while(1){
m_getch();
if(ch == '*'){
m_getch();
if(ch == '/'){
myword -> typenum = 29;
myword -> word = "/**/";
return (myword);
}
retract();
}
}
}
retract();
myword -> typenum = 16;
myword -> word = "/";
return (myword);
case '(':
myword -> typenum = 27;
myword -> word = "(";
return (myword);
case ')':
myword -> typenum = 28;
myword -> word = ")";
return (myword);
case ':':
m_getch();
if(ch == '='){
myword -> typenum = 18;
myword -> word = ":=";
return (myword);
}
retract();
myword -> typenum = 17;
myword -> word = ":";
return (myword);
case ';':
myword -> typenum = 26;
myword -> word = ";";
return (myword);
case '>':
m_getch();
if(ch == '='){
myword -> typenum = 24;
myword -> word = ">=";
return (myword);
}
retract();
myword -> typenum = 23;
myword -> word = ">";
return (myword);
case '<':
m_getch();
if(ch == '='){
myword -> typenum = 22;
myword -> word = "<=";
return (myword);
}
if(ch == '>'){
myword -> typenum = 21;
myword -> word = "<>";
return (myword);
}
retract();
myword -> typenum = 20;
myword -> word = "<";
return (myword);
case '\0':
myword -> typenum = 1000;
myword -> word = "OVER";
return (myword);
default:
myword -> typenum = -1;
myword -> word = "ERROR";
return (myword);
}
}
}