⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccifafenxi.cpp

📁 词法分析原程序 对C语言可以进行分析
💻 CPP
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define NULL 0
#define LEN sizeof(struct project)

struct project /*存放代码的结构体*/
{char c;
struct project *next;
};

struct keyword  /*存放保留字表*/
{char key[10];
char vc[7];
}stu[7]={{"main","(1,0)"},{"char","(3,0)"},{"if","(4,0)"},{"then","(9,0)"},{"else","(5,0)"},{"while","(7,0)"},
{"int","(2,0)"}};

int n;
int j=1;/*记录标志符的个数*/
char TOKEN[20];
char DATA[10];

struct project * creat(void)/*初始化代码结构体*/
{struct project *head;
struct project *p1,*p2;
n=0;
p1=p2=(struct project *)malloc(LEN);
scanf("%c",&p1->c);
head=NULL;
while(p2->c!='#')
{n=n+1;
  if(n==1) head=p1;
  else p2->next=p1;
  p2=p1;
  p1=(struct project *)malloc(LEN);
  scanf("%c",&p1->c);
}
p2->next=NULL;
return(head);
}

void print(struct project *head)
{struct project *p0;
p0=head;
if(head!=NULL)
         do
         {printf("%c\n",p0->c);
          p0=p0->next;
         }while(p0!=NULL);
}



void lookup(void)/*查保留字表*/
{
        int m=0;
        
        while(m<13)
        {
                if(strcmp(stu[m].key,TOKEN)!=0) m++;
                if(strcmp(stu[m].key,TOKEN)==0) {printf("%s的种别码为:%s\t",stu[m].key,stu[m].vc);break;}
        }

                if(m>=13) printf("%s的种别码为:(1,%d)\t\n",TOKEN,j++);
}

void main()
{
        struct project *head,*p,*p1;
        int i,d,r;
        
        printf("input the project:\n");
        p=head=creat();


        while(p->c!='#'){
                if(p->c==' ') p=p->next;
                if(p->c=='\n') p=p->next;

            if(p->c>='0'&&p->c<='9')
                {
                        DATA[0]=p->c;
                        p=p->next;d=1;

                        while(p->c>='0'&&p->c<='9')
                        {
                                DATA[d]=p->c;d++;
                                p=p->next;
                        }
                        if((p->c>='a'&&p->c<='z')||(p->c>='A'&&p->c<='Z'))
                                printf("**error**");
                        else 
                        {
                                printf("(2,");
                                for(r=0;r<d;r++)
                                        printf("%c\n",DATA[r]);
                                printf(")\t");
                        }
                }

                        

                if((p->c>='a'&&p->c<='z')||(p->c>='A'&&p->c<='Z'))
                {
                        TOKEN[0]=p->c;
                        p=p->next;i=1;

                        while((p->c>='a'&&p->c<='z')||(p->c>='A'&&p->c<='Z')||(p->c>='0'&&p->c<='9'))
                        {
                                TOKEN[i]=p->c;i++;
                                p=p->next;
                        }

                        TOKEN[i]='\0';
                        lookup();
                        
                }
        else 
                switch(p->c)
                {
                        case'<':p=p->next;
                                if(p->c=='=') {printf("<=的种别码为:(38,0)\t\n");p=p->next;}
                                else if(p->c=='>') {printf("<>的种别码为:(40,0)\t\n");p=p->next;}
                                else printf("<的种别码为:(36,0)\t\n");
                                break;
                                
                        case'=':printf("=种别码为:(21,0)\t\n");p=p->next;break;
                        case'>':p=p->next;
                                if(p->c=='=') {printf(">=种别码为:(37,0)\t\n");p=p->next;}
                                else printf(">种别码为:(35,0)\t\n");break;
                        case'+':printf("+的种别码为:(22,0)\t\n");p=p->next;break;
                        case'-':printf("-的种别码为:(23,0)\t\n");p=p->next;break;
                        case'*':printf("*的种别码为:(24,0)\t\n");p=p->next;break;
                        case'/':p = p->next;
                                if(p->c=='*')
                                {
                                        do{p1=p;p=p1->next;}while(p1->c=='*'&&p->c=='/');
                                        printf("/*注释*/\t\n");
                                        p=p->next;
                                }
								 else printf("/:(25,0)\t");p=p->next;break;
						
						
							     
                    
                        //case'~':printf("~:(20,0)\t");p=p->next;break;
                        case':':printf(":的种别码为:(33,0)\t\n");p=p->next;break;
                        case';':printf(";的种别码为:(34,0)\t\n");p=p->next;break;
                        //case'.':printf(".:(31,0)\t");p=p->next;break;
                        case',':printf(",的种别码为:(32,0)\t\n");p=p->next;break;
                        case'(':printf("(的种别码为:(26,0)\t\n");p=p->next;break;
                        case')':printf(")的种别码为:(27,0)\t\n");p=p->next;break;
						case'{':printf(")的种别码为:(30,0)\t\n");p=p->next;break;
						case'}':printf(")的种别码为:(31,0)\t\n");p=p->next;break;
					//	case''\0'':printf("):(1000,0)\t");p=p->next;break;
						case'[':printf(")的种别码为:(28,0)\t\n");p=p->next;break;
						case']':printf(")的种别码为:(29,0)\t\n");p=p->next;break;
						
                }
        
        }
        
} 




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -