码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-09-21 20:59:19      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

#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\n\n",input);
    while(over < 1000 && over != -1)
    {
        oneword = scaner();
        printf("(%d,%s)\n",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]=\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;
    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 \0:
            myword->typenum=1000;
            myword->word="OVER";
            return(myword);
            break;
        default:
            myword->typenum=-1;
            myword->word="ERROR";
            return(myword);
            }
        }
    }
技术分享

 

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

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!