首页 > 代码库 > 词法分析

词法分析

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

技术分享

<字母> => 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 1000void 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}");        }        else if(!strncmp(&input[*pos]-i,"if",2))        {            strcat(output,"{2,if}");        }        else if(!strncmp(&input[*pos]-i,"then",4))        {            strcat(output,"{3,then}");        }        else if(!strncmp(&input[*pos]-i,"while",5))        {            strcat(output,"{4,while}");        }        else if(!strncmp(&input[*pos]-i,"do",2))        {            strcat(output,"{5,do}");        }        else if(!strncmp(&input[*pos]-i,"end",3))        {            strcat(output,"{6,end}");        }        else        {            strcat(output,"{10,");            strncat(output,&input[*pos]-i,i);            strcat(output,"}");        }    }    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,"}");    }    else     {        switch(input[*pos])        {            case +:            {                strcat(output,"{13,+}");                (*pos)++;                break;            }            case -:            {                strcat(output,"{14,-}");                (*pos)++;                break;            }            case *:            {                strcat(output,"{15,*}");                (*pos)++;                break;            }            case /:            {                strcat(output,"{16,/}");                (*pos)++;                break;            }            case (:            {                strcat(output,"{27,(}");                (*pos)++;                break;            }            case ):            {                strcat(output,"{28,)}");                (*pos)++;                break;            }            case #:            {                strcat(output,"{0,#}");                (*pos)++;                return 0;            }            case ;:            {                strcat(output,"{26,;}");                (*pos)++;                break;            }            case =:            {                strcat(output,"{25,=}");                (*pos)++;                break;            }            case ::            {                (*pos)++;                if(input[*pos]===)                {                    strcat(output,"{18,:=}");                    (*pos)++;                }                else                {                    strcat(output,"{17,:}");                }            }            case <:            {                (*pos)++;                if(input[*pos]===)                {                    strcat(output,"{21,<=}");                    (*pos)++;                }                else if(input[*pos]==>)                {                    strcat(output,"{22,<>}");                    (*pos)++;                }                else                {                    strcat(output,"{20,<}");                }            }            case >:            {                (*pos)++;                if(input[*pos]===)                {                    strcat(output,"{24,>=}");                    (*pos)++;                }                else                {                    strcat(output,"{23,>}");                }            }        }    }    return 1;}
View Code

 

 昨天坐车塞好久,没机会发出,交晚了

词法分析