0916 编程实验一 词法分析程序

#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();
 
int main()
{
    int over = 1;
    WORD *oneword;
    oneword=(WORD *)malloc(sizeof(WORD));

    printf("input words:");
    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;
    }
}
 
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);
            }
        }
    }

原文地址:https://www.cnblogs.com/shuaibi/p/4827013.html