词法分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析相关的知识,希望对你有一定的参考价值。

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

技术分享

<字母> => 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}");
        }
        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

 

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

以上是关于词法分析的主要内容,如果未能解决你的问题,请参考以下文章

词法分析

词法分析器代码复审

实验一 词法分析器+编译原理

Second-词法分析

词法分析器

js词法分析