词法分析

从左至右地对源程序进行扫描,按照语言的词法规则识别各类单词,并产生以{种别码,属性}为格式的结果。

<字母> => a|b|c...x|y|z

<数字> => 0|1|2...7|8|9

<数字常数> => <数字>|<数字常数><数字>|<数字常数>.<数字常数>

<标识符> => <字母>|<标识符><字母>|<标识符><数字>

<关键字> => begin|if|then|while|do|end

<运算符> => +|-|*...>|>=|=

<界符> => ;|(|)|#

 

#include<stdio.h>
#include<string.h>
int Distinguish(char *input,char *output,int *pos);
#define Max 1000

void main ()
{
    char input[Max]="",output[Max*5]="";
    int pos=0;
    printf("input:");
    gets(input);
    while(Distinguish(input,output,&pos));
    printf("%s",output);
    
}
int Distinguish(char *input,char *output,int *pos)
{
    while(input[*pos]=='\n'||input[*pos]=='\t'||input[*pos]==' ')(*pos)++;
    if(input[*pos]>='A'&&input[*pos]<='z')
    {
        int i=1;
        for((*pos)++;input[*pos]>='A'&&input[*pos]<='z'||input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++);
        if(!strncmp(&input[*pos]-i,"begin",5))
        {    
            strcat(output,"{1,begin}\n");
        }
        else if(!strncmp(&input[*pos]-i,"if",2))
        {
            strcat(output,"{2,if}\n");
        }
        else if(!strncmp(&input[*pos]-i,"then",4))
        {
            strcat(output,"{3,then}\n");
        }
        else if(!strncmp(&input[*pos]-i,"while",5))
        {
            strcat(output,"{4,while}\n");
        }
        else if(!strncmp(&input[*pos]-i,"do",2))
        {
            strcat(output,"{5,do}\n");
        }
        else if(!strncmp(&input[*pos]-i,"end",3))
        {
            strcat(output,"{6,end}\n");
        }
        else
        {
            strcat(output,"{10,");
            strncat(output,&input[*pos]-i,i);
            strcat(output,"}\n");
        }
    }
    else if(input[*pos]>='0'&&input[*pos]<='9')
    {
        int i=1;
        for((*pos)++;input[*pos]>='0'&&input[*pos]<='9';i++,(*pos)++);
        strcat(output,"{11,");
        strncat(output,&input[*pos]-i,i);
        strcat(output,"}\n");
    }
    else 
    {
        switch(input[*pos])
        {
            case '+':
            {
                strcat(output,"{13,+}\n");
                (*pos)++;
                break;
            }
            case '-':
            {
                strcat(output,"{14,-}\n");
                (*pos)++;
                break;
            }
            case '*':
            {
                strcat(output,"{15,*}\n");
                (*pos)++;
                break;
            }
            case '/':
            {
                strcat(output,"{16,/}\n");
                (*pos)++;
                break;
            }
            case '(':
            {
                strcat(output,"{27,(}\n");
                (*pos)++;
                break;
            }
            case ')':
            {
                strcat(output,"{28,)}\n");
                (*pos)++;
                break;
            }
            case '#':
            {
                strcat(output,"{0,#}\n");
                (*pos)++;
                return 0;
            }
            case ';':
            {
                strcat(output,"{26,;}\n");
                (*pos)++;
                break;
            }
            case '=':
            {
                strcat(output,"{25,=}\n");
                (*pos)++;
                break;
            }
            case ':':
            {
                (*pos)++;
                if(input[*pos]=='=')
                {
                    strcat(output,"{18,:=}\n");
                    (*pos)++;
                }
                else
                {
                    strcat(output,"{17,:}\n");
                }
                break;
            }
            case '<':
            {
                (*pos)++;
                if(input[*pos]=='=')
                {
                    strcat(output,"{21,<=}\n");
                    (*pos)++;
                }
                else if(input[*pos]=='>')
                {
                    strcat(output,"{22,<>}\n");
                    (*pos)++;
                }
                else
                {
                    strcat(output,"{20,<}\n");
                }
                break;
            }
            case '>':
            {
                (*pos)++;
                if(input[*pos]=='=')
                {
                    strcat(output,"{24,>=}\n");
                    (*pos)++;
                }

                else
                {
                    strcat(output,"{23,>}\n");
                }
                break;
            }
        }
    }
    return 1;
}
View Code

 

posted @ 2016-10-01 14:17  130-张煌  阅读(103)  评论(0编辑  收藏  举报