首页 > 代码库 > 词法分析(自己的想法)
词法分析(自己的想法)
#include<stdio.h>#include<string.h>#define N 30char 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=http://www.mamicode.com/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==‘+‘||y==‘-‘||y==‘*‘||y==‘/‘||y==‘:‘||y==‘<‘||y==‘>‘)//判断字符是否是运算符 { if(p->next->data=http://www.mamicode.com/=‘=‘)//判断运算是否是由两个字符组成 { printf("(运算符,%c%c)\n",y,p->next->data); Q.front->next=p->next->next; free(p->next); } else printf("(运算符,%c)\n",y); } else if(y==‘=‘)//判断字符是否是运算符 printf("(运算符,%c)\n",y); else if(y>=48&&y<=57)//判断字符是否为数字 { j=t1++; st[j]=y;//将字符数字赋值给数组st if(p->next->data<48||p->next->data>57)//判断队列中下一个字符是否为数字,如果是非字符数字,则输出数组st if(st[0]!=‘\o‘) { printf("(常数,%s)\n",st); memset(st,0,N);//清空数组str里的所有元素 t1=0; } } else if(y==33||y==34||(y>=39&&y<=41)||y==44||y==46||y==58||y==59||(y>=91&&y<=96)||(y>=123&&y<=125))//判断是否为界符 printf("(界符,%c)\n",y); else if(y==‘ ‘) printf("(空格符,%c)\n",y);//判断空格符 else printf("(特殊符号,%c)\n",y);//其他的当作特殊符号处理 } free(p); return Q;}int main(){ char x,y; Queue p,q; p=InitQueue(); printf("请输入你想输入的字母、单词、短语、句子、字符等(必须以非数字结尾,否则程序出错):\n"); while(scanf("%c",&x)==1&&x!=‘\n‘)//大神的方法,牛 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,"break")==0||strcmp(str,"case")==0||strcmp(str,"char")==0||strcmp(str,"const")==0||strcmp(str,"continue")==0||strcmp(str,"default")==0||strcmp(str,"do")==0||strcmp(str,"double")==0||strcmp(str,"else")==0||strcmp(str,"enum")==0||strcmp(str,"extern")==0||strcmp(str,"float")==0||strcmp(str,"for")==0||strcmp(str,"goto")==0||strcmp(str,"if")==0||strcmp(str,"int")==0||strcmp(str,"long")==0||strcmp(str,"register")==0||strcmp(str,"return")==0||strcmp(str,"short")==0||strcmp(str,"signed")==0||strcmp(str,"sizeof")==0||strcmp(str,"static")==0||strcmp(str,"struct")==0||strcmp(str,"switch")==0||strcmp(str,"typedef")==0||strcmp(str,"unsigned")==0||strcmp(str,"union")==0||strcmp(str,"void")==0||strcmp(str,"volatile")==0||strcmp(str,"while")==0||strcmp(str,"auto")==0) printf("(关键字,%s)\n",str); else { if(str[0]==‘\0‘) return; printf("(标识符,%s)\n",str); } memset(str,0,N);//清空数组str里的所有元素}
词法分析(自己的想法)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。