📄 analyze.c
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#define PEND ":END"//字符串":END"表示输入的结束#define MAX_LENGTH 70//每行的最大长度/***********************************************************************************/struct InPut{char data[MAX_LENGTH];struct InPut *next;};/***********************************************************************************/struct InPut *text_input(){char forinput[MAX_LENGTH];struct InPut *p,*head,*r;head=(struct InPut *)malloc(sizeof(struct InPut));r=head;gets(forinput);while(strcmp(PEND,forinput)!=0)//如果该输入的字符串不为结束字符串的话,生成节点 {p=(struct InPut *)malloc(sizeof(struct InPut)); strcpy(p->data,forinput); r->next=p; r=p; gets(forinput); }r->next=NULL;return head;}/***********************************************************************************/int wch(char a)//{if((a>='A'&&a<='Z')||(a>='a'&&a<='z')||(a>='0'&&a<='9')||(a=='_'))return 1; else return 0;}/***********************************************************************************/print(){printf("----------------------------------------------\n"); printf("单词类型表\n"); printf("(1,基本字)\n(2,标识符)\n(3,常数)\n(4,运算符)\n(5,界符)\n"); printf("----------------------------------------------\n"); printf("关键字:\n"); printf("(1,main)\n(2,if)\n(3,int)\n(4,while)\n(5,else)\n"); printf("----------------------------------------------\n"); printf("运算符:\n"); printf("(1,'(')\n(2,')')\n(3,'>')\n(4,'<')\n(5,'+')\n(6,'-')\n(7,'*')\n(8,'/')\n"); printf("----------------------------------------------\n"); printf("界符:\n"); printf("(1,',')\n(2,';')\n"); printf("----------------------------------------------\n");}/***********************************************************************************/int wkey(char a[20])//判断是否关键字{if(strlen(a)==0)return -1; if(strcmp("main",a)==0)return 1; if(strcmp("if",a)==0)return 2; if(strcmp("int",a)==0)return 3; if(strcmp("while",a)==0)return 4; if(strcmp("else",a)==0)return 5; else return 0; }/***********************************************************************************/int wconst(char a[20])//判断是否是常数{int i=0,N; N=strlen(a); while(i<N) {if(a[i]>='0'&&a[i]<='9')i++; else break; } if(i==N) return 1; else return 0;}/***********************************************************************************/main(){struct InPut *p,*q,*forprint,*head,*r,*fortest;int N,i,j,count,count1=0;char temp[20];printf("请输入源程序:\n");p=text_input();p=p->next;head=(struct InPut *)malloc(sizeof(struct InPut));//建立一个变量表r=head;r->next=NULL;//变量表的初始为空while(p!=NULL) {i=0;j=0; N=strlen(p->data); while(i<=N+1) { if(wch(p->data[i])==1)temp[j++]=p->data[i++]; else if(p->data[i]=='\0') {temp[j]='\0',i++;} else { temp[j]='\0'; if(wkey(temp)==0&&wconst(temp)==0)//输入字符为变量 {count=0; fortest=head->next; if(r==head) { q=(struct InPut *)malloc(sizeof(struct InPut)); strcpy(q->data,temp); q->next=r->next; r->next=q; r=r->next; count++; } else {while(fortest!=NULL) {if(strcmp(fortest->data,temp)==0) {count++; break; } else {fortest=fortest->next; count++; } } if(fortest==NULL)//将该变量加入到变量表中 {q=(struct InPut *)malloc(sizeof(struct InPut)); strcpy(q->data,temp); q->next=r->next; r->next=q; r=r->next; count++; } } printf("(2,%d,%s)\n",count,temp); j=0; } else if(wkey(temp)!=0&&wkey(temp)!=-1)//关键字 {printf("(1,%d,%s)\n",wkey(temp),temp); j=0; } else if(wconst(temp)==1&&strlen(temp)!=0)//常数 {printf("(3,%s)\n",temp); j=0; } switch(p->data[i])//打印界符和运算符 {case '\0':break; case '(':printf("(4,1,'(')\n");break; case ')':printf("(4,2,')')\n");break; case '>':printf("(4,3,'>')\n");break; case '<':printf("(4,4,'<')\n");break; case '=':printf("(4,5,'=')\n");break; case '{':printf("(4,6,'{')\n");break; case '}':printf("(4,7,'}')\n");break; case ',':printf("(5,1,',')\n");break; case ':':printf("(5,2,';')\n");break; } i++; } } p=p->next; } printf("附表:\n"); print(); forprint=head->next; if(forprint==NULL)printf("该程序中没有变量\n"); else {printf("变量:\n"); while(forprint!=NULL) {printf("(%d,%s)\n",++count1,forprint->data); forprint=forprint->next; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -