• 词法分析(作业)


    #include<stdio.h>
    #include<string.h>
    #define N 30
    char str[N]={NULL},st[N]={NULL};
    int t=0,t1=0;
    struct node//定义一个队列
    {
        char data;
        struct node * next;
    };
    typedef struct node QueueNode;
    struct node2//定义一个链队列
    {
        QueueNode *front;
        QueueNode *rear;
    };
    typedef struct node2 Queue;
    void Print(char str[]);
    void Print1(char str1[]);
    Queue InitQueue()//初始化队列
    {
        Queue Q;
        Q.front=(QueueNode *)malloc(sizeof(QueueNode));
        Q.front->next=NULL;
        Q.rear=Q.front;
        return(Q);
    }
    Queue InserQ(Queue Q,char x)//x进队列
    {
        QueueNode *p;
        p=(QueueNode *)malloc(sizeof(QueueNode));
        p->data=x;
        p->next=NULL;
        Q.rear->next=p;
        Q.rear=p;
        return(Q);
    }
    Queue DeleteQ(Queue Q)//出队列
    {
        int i=t++,j;
        QueueNode *p;
        char y=NULL;
        if(Q.front==Q.rear)
        {
            printf("队列为,无法出队列!");//判断队列是否为空
            return(Q);
        }
        p=Q.front->next;
        y=Q.front->next->data;//将队列中的元素赋值给y
        Q.front->next=p->next;
        if(p==Q.rear)
            Q.rear=Q.front;
        if((y>='A'&&y<='Z')||(y>='a'&&y<='z'))//利用ASCII判断y是否是属于字母,并存储在数组str中
            str[i]=y;
        else
        {
            if(str[0]!=NULL)//如果数组str非空,则输出
                Print(str);
            t=0;
            if(y=='+')
                printf("(13,'%c')
    ",y);
            else if(y=='-')
                printf("(14,'%c')
    ",y);
            else if(y=='*')
                printf("(15,'%c')
    ",y);
            else if(y=='/')
                printf("(16,'%c')
    ",y);
            else if(y==':')
            {
                if(p->next->data=='=')//判断运算是否是由两个字符组成
                {
                    printf("(18,'%c%c')
    ",y,p->next->data);
                    Q.front->next=p->next->next;
                    free(p->next);
                }
                else
                    printf("(17,'%c')
    ",y);
            }
            else if(y=='<')
            {
                if(p->next->data=='=')//判断运算是否是由两个字符组成
                {
                    printf("(21,'%c%c')
    ",y,p->next->data);
                    Q.front->next=p->next->next;
                    free(p->next);
                }
                else if(p->next->data=='>')//判断运算是否是由两个字符组成
                {
                    printf("(22,'%c%c')
    ",y,p->next->data);
                    Q.front->next=p->next->next;
                    free(p->next);
                }
                else
                    printf("(20,'%c')
    ",y);
            }
            else if(y=='>')
            {
                if(p->next->data=='=')//判断运算是否是由两个字符组成
                {
                    printf("(24,'%c%c')
    ",y,p->next->data);
                    Q.front->next=p->next->next;
                    free(p->next);
                }
                else
                    printf("(23,'%c')
    ",y);
            }
            else if(y=='=')//判断字符是否是运算符
                printf("(25,'%c')
    ",y);
            else if(y==';')
                printf("(26,'%c')
    ",y);
            else if(y=='(')
                printf("(27,'%c')
    ",y);
            else if(y==')')
                printf("(28,'%c')
    ",y);
            else if(y=='#')
                printf("(0,'%c')
    ",y);
            else if(y>=48&&y<=57)//判断字符是否为数字
            {
                j=t1++;
                if(j==0)
                    printf("(11,'");
                printf("%c",y);
                if(p->next->data<48||p->next->data>57)//判断队列中下一个字符是否为数字,如果是非字符数字,则输出数组st
                    if(st[0]!='o')
                    {
                        printf("')
    ");
                        t1=0;
                    }
            }
            else if(y==' ');
            else
                printf("(非法字符,'%c')
    ",y);//其他的当作特殊符号处理
        }
        free(p);
        return Q;
    }
    int main()
    {
        char x,y;
        Queue p,q;
        p=InitQueue();
        printf("请输入你想输入的字母、单词、短语、句子、字符等(必须以非数字结尾,否则程序出错):
    ");
        while(scanf("%c",&x)==1&&x!='
    ')//大神的方法,牛
            p=InserQ(p,x);
        q=p;
        while(p.front!=p.rear)
            p=DeleteQ(p);
        if(str[0]!='o')//判断数组str是否为空
            Print(str);
    }
    void Print(char str[])//调用函数来判断关键字与标识符
    {
    
        int i=0;
        if(strcmp(str,"begin")==0)
            printf("(1,'%s')
    ",str);
        else if(strcmp(str,"if")==0)
            printf("(2,'%s')
    ",str);
        else if(strcmp(str,"then")==0)
            printf("(3,'%s')
    ",str);
        else if(strcmp(str,"while")==0)
            printf("(4,'%s')
    ",str);
        else if(strcmp(str,"do")==0)
            printf("(5,'%s')
    ",str);
        else if(strcmp(str,"end")==0)
            printf("(6,'%s')
    ",str);
        else
        {
            if(str[0]=='')
                return;
            printf("(10,'%s')
    ",str);
        }
        memset(str,0,N);//清空数组str里的所有元素
    }

  • 相关阅读:
    vue 把后端返回的图片和url链接生成的二维码用canvas 合成一张图片
    Dart和JavaScript对比小结
    webgl学习,知识储备
    nightwatch+selenium做e2e自动化测试采坑小计
    linux centos7 环境变量设置
    ES6学习笔记
    SQLserver数据库还原语句
    AngularJs的那些坑(持续更新...)
    Hosting socket.io WebSocket apps in IIS using iisnode
    mongodb 数据库操作--备份 还原 导出 导入
  • 原文地址:https://www.cnblogs.com/2647409627qq/p/5921159.html
Copyright © 2020-2023  润新知