zoukankan      html  css  js  c++  java
  • 词法分析 130

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

    <字母> => 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
  • 相关阅读:
    Django集成Bootstrap美化后台
    python3 Django集成Ueditor富文本编辑器
    mysql-cluster集群配置
    centos7安装mysql8
    python升级pip和Django安装
    删除某日期之前的日志文件夹
    linux文件系统变为只读解决
    xargs实例
    linux终端提示符显示bash-4.2#
    Codeforces Round #478 (Div. 2)
  • 原文地址:https://www.cnblogs.com/hehe2333/p/5925794.html
Copyright © 2011-2022 走看看