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

📄 javascanner.c

📁 编译原理课程实验
💻 C
📖 第 1 页 / 共 2 页
字号:
				        printf("%d: too big for character\n",line);
					}
				    else{
					    ch=num_value;
					}
				    num_value=0;
				}
			}
	        if((ch=token_getch())!='\'')
			    printf("%d: ''' expected\n");
		        front=rear;
		        insert(++position,2,0x106,&ch);
		}
/*------------------------------处理分界符及部分运算符-----------------------------*/ 
	    else if(ch==','){
            front=rear;
		    insert(++position,2,0x120,",");
		}
	    else if(ch=='{'){
		    front=rear;
		    insert(++position,2,0x121,"{");
		}
	    else if(ch=='}'){
		    front=rear;
		    insert(++position,2,0x121,"}");
		}
	    else if(ch==';'){
		    front=rear;
		    insert(++position,2,0x122,";");
		}
	    else if(ch=='['){
		    front=rear;
		    insert(++position,2,0x11d,"[");
		}
	    else if(ch==']'){
		    front=rear;
		    insert(++position,2,0x11d,"]");
		}
	    else if(ch=='('){
		    front=rear;
		    insert(++position,2,0x11d,"(");
		}
	    else if(ch==')'){
		    front=rear;
		    insert(++position,2,0x11d,")");
		}
	    else if(ch=='.'){
		    ch=token_getch();
		    if(!isdigit(ch)){
			    rear--;
                front=rear;
		        insert(++position,2,0x11d,".");
			}
		    else{
			    do{
				    id[dex++]=ch;
				    ch=token_getch();
				}while(isdigit(ch));
			    insert(++position,dex,0x108,id);
			    rear--;
			    front=rear;
			    dex=0;
			    memset(id,0,100);
			}
		}
	    else if(ch=='='){
		    ch=token_getch();
	    	if(ch=='='){
		    	insert(++position,3,0x117,"==");
			}
		    else{
			    rear--;
			    insert(++position,2,0x110,"=");
			}
		    front=rear;
		}
	    else if(ch=='+'){
		    ch=token_getch();
		    if(ch=='+'){
			    insert(++position,3,0x11c,"++");
			}
		    else if(ch=='='){
			    insert(++position,3,0x110,"+=");
			}
		    else{ 
			    rear--;
			    while(buffer[front--]==' ');
			        front++;
			        if( isalpha(buffer[front])||isdigit(buffer[front]) ){
				        insert(++position,2,0x11a,"+");
					}
			        else{
				        insert(++position,2,0x11c,"+");
					}
			}
		    front=rear;
		}
	    else if(ch=='-'){
		    ch=token_getch();
		    if(ch=='-'){
			    insert(++position,3,0x11c,"--");
			}
		    else if(ch=='='){
			    insert(++position,3,0x110,"-=");
			}
		    else{ 
			    rear--;
			    while(buffer[front--]==' ');
			    front++;
			    if( isalpha(buffer[front])||isdigit(buffer[front]) ){
				    insert(++position,2,0x11a,"-");
				}
			    else{
				    insert(++position,2,0x11c,"-");
				}
			}
		    front=rear;
		}
	    else if(ch=='*'){
		    ch=token_getch();
			if(ch=='='){
				insert(++position,3,0x110,"*=");
			}
		    else{
			    rear--;
		    	insert(++position,2,0x11b,"*");
			}
    		front=rear;
		}
	    else if(ch=='%'){
		    ch=token_getch();
		    if(ch=='='){
			    insert(++position,3,0x110,"%=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x11b,"%");
			}
		    front=rear;
		}
    	else if(ch=='&'){
	    	ch=token_getch();
		    if(ch=='&'){
			    insert(++position,3,0x113,"&&");
			}
		    else if(ch=='='){
			    insert(++position,3,0x110,"&=");
			}
		    else{
			    rear--;
			    insert(++position,1,0x116,"&");
			}
		    front=rear;
		}
	    else if(ch=='^'){
		    ch=token_getch();
		    if(ch=='='){
			    insert(++position,3,0x110,"^=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x115,"^");
			}
		    front=rear;
		}
	    else if(ch=='|'){
		    ch=token_getch();
		    if(ch=='|'){
			    insert(++position,3,0x112,"||");
			}
		    else if(ch=='='){
			    insert(++position,3,0x110,"|=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x114,"|");
			}
		    front=rear;
		}
	    else if(ch=='!'){
		    ch=token_getch();
		    if(ch=='='){
			    insert(++position,3,0x117,"!=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x11c,"!");
			}
		    front=rear;
		}
	    else if(ch=='>'){
		    ch=token_getch();
		    if(ch=='>'){
			    ch=token_getch();
			    if(ch=='>'){
				    ch=token_getch();
				    if(ch=='='){
					    insert(++position,5,0x110,">>>=");
					}
				    else{
					    rear--;
					    insert(++position,4,0x119,">>>");
					}
				}
			    else{
				    rear--;
				    insert(++position,3,0x119,">>");
				}
			}
		    else if(ch=='='){
			    insert(++position,3,0x118,">=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x118,">");
			}
	    	front=rear;
		}
	    else if(ch=='<'){
		    ch=token_getch();
		    if(ch=='<'){
			    ch=token_getch();
			    if(ch=='='){
				    insert(++position,4,0x110,"<<=");
				}
			    else{
				    rear--;
				    insert(++position,3,0x118,"<<");
				}
			}
		    else if(ch=='='){
			    insert(++position,3,0x118,"<=");
			}
		    else{
			    rear--;
			    insert(++position,2,0x118,"<");
			}
		    front=rear;
		}
	    else if(ch=='~'){
		    insert(++position,2,0x11c,"~");
		}
	    else if(ch=='?'){
			tri_op=1;
		}
	    else if(ch==':'){
			if(tri_op==1){
		        insert(++position,3,0x111,"?:");
				tri_op=0;
			}
			else{
				insert(++position,2,0x11e,":");
			}
		}
/*------------------------------------数值处理(把数字以字符串的形式记录到单词表中)------------------------------*/
	    else if(isdigit(ch)){
		    id[dex++]=ch;
	    	ch=token_getch();
	     	if(ch=='X' || ch=='x'){
		    	do{
			    	id[dex++]=ch;
				    ch=token_getch();
				}while(isdigit(ch)||ch=='A'||ch=='a'||ch=='B'||ch=='b'||ch=='C'||ch=='c'||ch=='D'||ch=='d'||ch=='E'||ch=='e'||ch=='F'||ch=='f');
				if(!(ch=='A'||ch=='a'||ch=='B'||ch=='b'||ch=='C'||ch=='c'||ch=='D'||ch=='d'||ch=='E'||ch=='e'||ch=='F'||ch=='f')&&(isalpha(ch))){
                    id[dex++]=ch;
					insert(++position,dex,0x100,id);
				}
				else
					insert(++position,dex,0x107,id);
			    dex=0;
		    	memset(id,0,100);
			}
		    else{
			    while(isdigit(ch)){
				    id[dex++]=ch;
				    ch=token_getch();
				}
			    if(ch=='L'||ch=='l'){
				    id[dex++]=ch;
				    ch=token_getch();
				    insert(++position,dex,0x107,id);
					rear--;
					front=rear;
			        dex=0;
			        memset(id,0,100);
				}
			    else if(ch=='.'||ch=='e'||ch=='E'){
				    do{
					    id[dex++]=ch;
					    ch=token_getch();
					}while(isdigit(ch));
				    if(ch=='F'|| ch=='f'){
					    id[dex++]=ch;
						rear--;
						front=rear;
					    ch=token_getch();
					}
				    insert(++position,dex,0x108,id);
			        dex=0;
					rear--;
					front=rear;
			        memset(id,0,100);
				}
				else if(!( isalpha(ch)&&!(ch=='L'||ch=='l'||ch=='e'||ch=='E'||ch=='F'|| ch=='f') )){
					insert(++position,dex,0x108,id);
			        dex=0;
					rear--;
					front=rear;
			        memset(id,0,100);
				}
				else{
					id[dex++]=ch;
					insert(++position,dex,0x100,id);
			        dex=0;
					rear--;
					front=rear;
			        memset(id,0,100);
				}

			}
		}
/*-----------------------------其他情况视为错误单词--------------------------------------------*/
		else if(ch!=EOF){
			insert(++position,2,0x100,id);
			dex=0;
			rear--;
			front=rear;
			memset(id,0,100);
		}

	}
} 	
int main(int argc,char * argv[]){
    
	char filename[100],dest_file[100];
	int  total=0;
	int  i,line_num;

	struct token* p;

	token_list_head=(struct token*)malloc(sizeof(token));
	token_list_head->next_token=NULL;
	token_list_tail=token_list_head;


    //设立缓冲区标志位
	buffer[1023]=EOF;
    buffer[2047]=EOF;
    
	//输入原文件名及目标文件名
	printf("Please enter source file name:\n");
    scanf("%s",filename);

	printf("\n");
	printf("Please enter destination file name:\n");
    scanf("%s",dest_file);

    //打开文件,并将1023个字符读入前一半缓冲区
	fin=fopen(filename,"rb+");
    if(fin==NULL){
		printf("FILE_CANNOT_OPEN\n");
	}
	else{
		load(fin,0);

	}
	//开始分析
    get_token();

	//将分析结果写入目标文件
    if((fin=fopen(dest_file,"w"))==NULL){
	}
	else{
       
		fprintf(fin,"\n%s:\n\n","    词法分析结果如下(每个单词包含四个属性值:行号,在该行中位置,十六进制属性值,字面值)");
        for(p=token_list_head->next_token;p!=NULL;p=p->next_token){
			total++;
            fprintf(fin,"%s","    ");
			fputc('(',fin);
			fprintf(fin,"第 %3d行 ,第 %3d个单词, 0x%x , \"%s\" ",p->lineno,p->position,p->wordkey,p->value);
			fputc(')',fin);
			fputc('\n',fin);
		}
        fprintf(fin,"\n%s: %d\n\n","    单词总量为",total);
		p=token_list_head->next_token;
		for(i=1;i<=line;i++){
			line_num=0;
			while(p!=NULL&&p->lineno==i){
			    p=p->next_token;
			    line_num++;
			}
            fprintf(fin,"    第 %3d行中单词数量为: %d\n",i,line_num);
		}
		fclose(fin);
		printf("Result writed to result.txt successed!\n");
	}
}
	

⌨️ 快捷键说明

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