zoukankan      html  css  js  c++  java
  • 语法分析程序

    语法分析程序

    #include<stdio.h> #include <stdlib.h> typedef struct link //字符链表 { char data; struct link *next; }Link; char special[10]; void specialchar(Link *charhead); main() { char n; Link *charhead; //定义头结点 Link *p,*q; charhead=q=(Link *)malloc(sizeof(Link)); //申请空间 charhead->next=q; //初始化链表 q->next=NULL; printf("请输入一个字符串:"); do { scanf("%c",&n); if(n==' ') break; p=(Link *)malloc(sizeof(Link)); p->data=n; //把输入的字符存入链表中 p->next=NULL; q->next=p; q=p; }while(n!=' '); q=charhead->next; /*while(q!=NULL) { printf("%c",q->data); q=q->next; }*/ printf("语法分析: "); specialchar(charhead); } void specialchar(Link *charhead) { Link *q,*p; int i; q=charhead->next; while(q!=NULL) { switch(q->data) { case 'b': //判断是否是标识符begin special[0]=q->data; //一步一步存入数组 q=q->next; if(q->data=='e') { special[1]=q->data; q=q->next; if(q->data=='g') { special[2]=q->data; q=q->next; if(q->data=='i') { special[3]=q->data; q=q->next; if(q->data=='n') { special[4]=q->data; printf("<标识符> "); for(i=0;i<5;i++) printf("%c",special[i]); printf(" "); } } } } break; case 'i': //判断是否是标识符if special[0]=q->data; q=q->next; if(q->data=='f') { special[1]=q->data; printf("<标识符> "); for(i=0;i<2;i++) printf("%c",special[i]); printf(" "); } break; case 't': special[0]=q->data; q=q->next; if(q->data=='h') { special[1]=q->data; q=q->next; if(q->data=='e') { special[2]=q->data; q=q->next; if(q->data=='n') { special[3]=q->data; printf("<标识符> "); for(i=0;i<4;i++) printf("%c",special[i]); printf(" "); } } } break; case 'w': special[0]=q->data; //一步一步存入数组 q=q->next; if(q->data=='h') { special[1]=q->data; q=q->next; if(q->data=='i') { special[2]=q->data; q=q->next; if(q->data=='l') { special[3]=q->data; q=q->next; if(q->data=='e') { special[4]=q->data; printf("<标识符> "); for(i=0;i<5;i++) printf("%c",special[i]); printf(" "); } } } } break; case 'd': special[0]=q->data; q=q->next; if(q->data=='o') { special[1]=q->data; printf("<标识符> "); for(i=0;i<2;i++) printf("%c",special[i]); printf(" "); } if(q->data=='d') { special[1]=q->data; q=q->next; if(q->data=='*') { special[2]=q->data; printf("<标识符> "); for(i=0;i<3;i++) printf("%c",special[i]); printf(" "); } } break; case 'e': special[0]=q->data; q=q->next; if(q->data=='f') { special[1]=q->data; q=q->next; if(q->data=='f') { special[2]=q->data; printf("<标识符> "); for(i=0;i<3;i++) printf("%c",special[i]); printf(" "); } } break; case 'l': special[0]=q->data; //一步一步存入数组 q=q->next; if(q->data=='(') { special[1]=q->data; q=q->next; if(q->data=='l') { special[2]=q->data; q=q->next; if(q->data=='|') { special[3]=q->data; q=q->next; if(q->data=='d') { special[4]=q->data; q=q->next; if(q->data==')') { special[5]=q->data; q=q->next; if(q->data=='*') { special[6]=q->data; printf("<标识符> "); for(i=0;i<7;i++) printf("%c",special[i]); printf(" "); } } } } } } break; case '+': printf("<加号> %c",q->data); printf(" "); break; case '-': printf("<减号> %c",q->data); printf(" "); break; case '*': printf("<乘号> %c",q->data); printf(" "); break; case '/': printf("<标识符> %c",q->data); printf(" "); break; case ':': special[0]=q->data; q=q->next; if(q->data=='=') { special[1]=q->data; printf("<赋值号> "); for(i=0;i<2;i++) printf("%c",special[i]); } else printf("<赋值号> %c",special[0]); printf(" "); break; case '<': special[0]=q->data; q=q->next; if(q->data=='=') { special[1]=q->data; printf("<标识符> "); for(i=0;i<2;i++) printf("%c",special[i]); printf(" "); } else if(q->data=='>') { special[1]=q->data; printf("<标识符> "); for(i=0;i<2;i++) printf("%c",special[i]); printf(" "); } else{ printf("<小于号> "); printf("%c",special[0]); printf(" "); } break; case '>': special[0]=q->data; q=q->next; if(q->data=='=') { special[1]=q->data; printf("<标识符> "); for(i=0;i<2;i++) printf("%c",special[i]); printf(" "); } else{ printf("<大于号> "); printf("%c",special[0]); printf(" "); } break; case '=': printf("<赋值符> %c",q->data); printf(" "); break; case ';': printf("<分号> %c",q->data); printf(" "); break; case '(': printf("<左括号> %c",q->data); printf(" "); break; case ')': printf("<右括号> %c",q->data); printf(" "); break; case '#': printf("<井号> %c",q->data); printf(" "); break; } q=q->next; } }
  • 相关阅读:
    atitit.面向过程的编程语言异常处理 c语言 asp vbs 的try catch 实现
    Atitit.ide代码块折叠插件 eclipse
    Atitit.注重细节还是关注长远??长远优先
    atitit.安全的签名摘要 算法attilax总结
    Atitit.各种 数据类型 ( 树形结构,表形数据 ) 的结构与存储数据库 attilax 总结
    Atitit. 委托的本质 c#.net java php的比较
    Atitit.注册跟个登录功能的实现attilax总结obo
    atitit..sql update语法的词法分析,与语法ast构建
    atitit.GUI图片非规则按钮跟动态图片切换的实现模式总结java .net c# c++ web html js
    Atitit.数据库事务隔离级别 attilax 总结
  • 原文地址:https://www.cnblogs.com/veol/p/5924723.html
Copyright © 2011-2022 走看看