zoukankan      html  css  js  c++  java
  • 编程实验一 词法分析程序

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct node{
        char zifuji[20];
        struct node *next;
    }NODE;
    
    typedef struct stack{
        char num[20];
        int size;
    }STACK;
    
    void cmp(char *ch);
    int shizi(char ch[]);
    //字转词
    void zizhuanci(NODE *node){
        
        NODE *p;
        p=node->next;
    
        while(p!=NULL){
            
            cmp(p->zifuji);        
    
            p=p->next;
        }
    
    }
    //判断词义
    void cmp(char *ch){ int key; if(strcmp(ch,"begin")==0){ printf("<%s 1 > ",ch); } else if(strcmp(ch,"if")==0){ printf("<%s 2 > ",ch); } else if(strcmp(ch,"then")==0){ printf("<%s 3 > ",ch); } else if(strcmp(ch,"while")==0){ printf("<%s 4 > ",ch); } else if(strcmp(ch,"do")==0){ printf("<%s 5 > ",ch); } else if(strcmp(ch,"end")==0){ printf("<%s 6 > ",ch); } else if(strcmp(ch,"+")==0){ printf("<%s 13> ",ch); } else if(strcmp(ch,"-")==0){ printf("<%s 14> ",ch); } else if(strcmp(ch,"*")==0){ printf("<%s 15> ",ch); } else if(strcmp(ch,"/")==0){ printf("<%s 16> ",ch); } else if(strcmp(ch,":")==0){ printf("<%s 17> ",ch); } else if(strcmp(ch,":=")==0){ printf("<%s 18> ",ch); } else if(strcmp(ch,"<")==0){ printf("<%s 20> ",ch); } else if(strcmp(ch,"<=")==0){ printf("<%s 21> ",ch); } else if(strcmp(ch,"<>")==0){ printf("<%s 22> ",ch); } else if(strcmp(ch,">")==0){ printf("<%s 23> ",ch); } else if(strcmp(ch,">=")==0){ printf("<%s 24> ",ch); } else if(strcmp(ch,"=")==0){ printf("<%s 25> ",ch); } else if(strcmp(ch,";")==0){ printf("<%s 26> ",ch); } else if(strcmp(ch,"(")==0){ printf("<%s 27> ",ch); } else if(strcmp(ch,")")==0){ printf("<%s 28> ",ch); } else if(strcmp(ch,"#")==0){ printf("<%s 0> ",ch); } else{ key=shizi(ch); if(key==1) printf("<%s 12> ",ch,key); else if(key==2) printf("<%s 11> ",ch,key); else printf("<%s 错误> ",ch,key); } } //判断数字词义 int shizi(char ch[]){ int i; int key=0; for(i=0;i<=sizeof(ch);i++) if((ch[i]>='0'&&ch[i]<='9')||(ch[i]>='a'&&ch[i]<='z')) key=1; else if(ch[i]>='0'&&ch[i]<='9') key=2; return key; } //字分成词 int word_splitter(char* str,NODE *node){ NODE *p,*q; p=node; int length = strlen(str); char aword[20]; int number = 0; int start = 0; memset(aword, 0, 20); for(int i = start; i < length; ++i){ if(str[i] == ' '){ memcpy(aword, str + start, i - start); ++number; //printf("%d %s ", number, aword); q=(NODE *)malloc(sizeof(NODE)); q->next=NULL; strcpy(q->zifuji,aword); p->next=q; p=q; memset(aword, 0, 20); start = i + 1; } } if(start < length) { memcpy(aword, str + start, length - start); ++number; //printf("%d %s ", number, aword); q=(NODE *)malloc(sizeof(NODE)); q->next=NULL; strcpy(q->zifuji,aword); p->next=q; p=q; } return number; } int main(){ NODE *node,*p,*q; int i; STACK *stack; int size=-1; node = p =(NODE *)malloc(sizeof(NODE)); stack=(STACK *)malloc(sizeof(STACK)); printf("请输入: "); for(i=0;i<1;i++){ q=(NODE *)malloc(sizeof(NODE)); gets(node->zifuji); q=p->next; puts(node->zifuji); //printf("%d",sizeof(node->zifuji)); } i=word_splitter(node->zifuji,node); /* p=node->next; while(p){ puts(p->zifuji); printf(" "); p=p->next; } */ zizhuanci(node); return 0; }
  • 相关阅读:
    thinkphp redis实现文章点赞功能并同步入mysql
    phpstorm2020.1最新版永久破解
    mysql修改sql_mode为宽松模式
    用为知发布博客到博客园、使用Wiz编写和发布博客园(cnblogs)博客
    Vim命令大全
    Vim教程
    GDB教程详解
    TCMalloc 对MYSQL 性能 优化的分析
    TCMalloc 安装和使用
    使用Tcmalloc进行堆栈分析
  • 原文地址:https://www.cnblogs.com/caishun/p/4826934.html
Copyright © 2011-2022 走看看