?? ccc.cpp
字號:
#include "stdafx.h"
#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<iostream>
//****************************************
char * change(char *ps,char *pt); //處理路徑中的反斜杠問題。因為在字符串中要用\\表示\
int searchkey(char *word,struct key tab[],int n);//關鍵字匹配函數
int searchsymbol(char c,struct symbol tab[],int n);//符號匹配函數
void getword(char c,FILE * p);
void getnum(char c,FILE * p);
//****************************************
//用到的結構數組:
struct key{ //關鍵字表
char* word;
int value;
}
keytab[] = {
"else", 0, "if", 1,"for", 2, "return",3, "void", 4,
"while", 5, "auto", 6,"struct",7, "char" , 8, "int" , 9,
"long" , 10,"float" ,11, "double",12," signed", 13, "case",14,
"switch",15, "unsigned", 16,"sizeof", 17, "break", 18,"do", 19,
"short",20, "printf",21 ,"scanf",22,"main",23
};
//*******************************
struct symbol{ //符號表
char c;
int value;
}
symboltab[] = {
'-', 0, '/', 1,
'*', 2, '+', 3,
'=', 4, '<', 5,
'>', 6, ';', 7,
'(', 8, ',', 9,
')', 10, '[', 11,
']', 12, '{', 13,
'}', 14, '"', 15,
'~', 16, '|',17,
'_', 18, '&',19,
'%',20 , '\\',21,
'#',22 , ':', 23,
'.', 24,
};
//*****************************************
//用到的常量
enum{MAX = 50,
NKEYS = sizeof keytab / sizeof keytab[0],
NSYMBOL = sizeof symboltab / sizeof symboltab[0]
};
//*****************************************
int flagnum = 0; //用來防止出現10t這種情況被當作數字處理。這種情況flagnum=1程序報錯
int countnum = 0;
int countid = 0; //標識符計數(標識符定義為:以字母開頭的非關鍵字的字符串)
int countfault = 0;
int type[] = {0,1,2,3,4,5}; //詞法分析中的類型 依次為 關鍵字-0,常數-1,標識符-2,算符-3,界符-4, 錯誤顯示-5
char array[MAX]; //存放getword中的字符串,用于字符串類型判斷
//*****************************************
main()
{
char c;
int flag; //判斷搜索函數是否成功返回
char s[MAX]; //數組s,t用來存放讀取文件的路徑
char t[2 * MAX];
char *ps = s;
char *pt = t;
FILE * p = NULL;
printf("輸入你要的文件路徑\n");
scanf("%s",s);
p = fopen( change(ps,pt),"r" ); //打開文件
if( p == NULL ){ //如果輸入的文件路徑不對或文件不存在,報錯
printf("打開失敗輸入 1 退出\n");
scanf("%d",&c);
exit(0);
}
printf("詞 \t (組號,組內類號)\n");
while( ( c = fgetc(p) ) != EOF )
{
if ( isspace(c) ) // 如果是空白字符
continue;
else if ( isalpha(c) )
//如果是字母開頭
getword(c,p);
else if ( isdigit(c) ){ //如果是數字開頭,判斷是否數字或者錯誤輸入
getnum(c,p);
}
else if ( ispunct(c) ){ //如果是符號
flag = searchsymbol(c,symboltab,NSYMBOL);
if ( flag <=6 )
printf("%c\t(%4d,%5d)\n",c,type[3],flag); //算符
else if(flag>6)
{ printf("%c\t(%4d,%5d)\n",c,type[4],flag-7);} //界符
else if(flag<0){
printf("%c\t(%4d,%5d) Unknow char\n",c,type[5],countfault++); //出錯處理
countfault ++;
}
}
else{
printf("%c\t(%4d,%5d)\n",c,type[5],countfault++); //出錯處理
countfault ++;
}
}
printf("任意輸入,回車結束");
scanf("%d",&c);
}
void getnum(char c,FILE * p)
{ int i =0;
array[i]=c;
flagnum=0;
int flag;
while( (c = fgetc(p)) != ' ' && c!= '\n'&&!ispunct(c)){ //數字后帶字符,數字讀取結束,循環結束
array[++i] = c;
if(isalpha(c)) flagnum=1; //如果數字中有字母,報錯,并且把后面的字母讀完,存入array 緩沖
}
array[++i]='\0';
if ( flagnum == 0 )
printf("%s\t(%4d,%5d)\n",array,type[1],countnum++); //輸出數字,數字計數vountnum自加+
else
printf("%s\t(%4d,%5d)\t 錯誤的數字輸入 \n",array,type[5],countfault++); //錯誤號countfault自加1
if(ispunct(c))
{ flag = searchsymbol(c,symboltab,NSYMBOL); //判斷數字后面跟的字符類型
if ( flag <= 6 )
printf("%c\t(%4d,%5d)\n",c,type[3],flag);
else if(flag>6)
printf("%c\t(%4d,%5d)\n",c,type[4],flag-7);
else if(flag<0){
printf("%c\t(%4d,%5d) 沒有這個字符\n",c,type[5],countfault); //出錯處理
countfault ++;
}
}
}
void getword(char c,FILE * p)
{ int i = 0;
int flag;
array[i] = c;
while( (c = fgetc(p)) != ' ' && c != '\n'&&!ispunct(c)){ //字母后面跟字符,退出循環
array[++i] = c;
}
array[++i]='\0';
flag=searchkey(array,keytab,NKEYS);
if ( flag >= 0 ) //如果是關鍵字
printf("%s\t(%4d,%5d)\n",array,type[0],flag);
else if(flag<0) { //如果以字母開頭,但不是關鍵字,則判斷為標識符
printf("%s\t(%4d,%5d)\n",array,type[2],countid);
countid ++;
}
if(ispunct(c))
{ flag = searchsymbol(c,symboltab,NSYMBOL);
if ( flag <= 6 )
printf("%c\t(%4d,%5d)\n",c,type[3],flag);
else if(flag>6)
printf("%c\t(%4d,%5d)\n",c,type[4],flag-7);
else if(flag<0){
printf("%c\t(%4d,%5d) 沒有這個字符 \n",c,type[5],countfault++); //出錯處理
countfault ++;
}
}
}
//*******************************************
char * change(char *ps,char *pt) //處理反斜杠的問題
{
char *p = pt;
char c;
while( (c = *pt++ = *ps++) != '\0' )
if( c == '\\' )
*pt = '\\';
return p;
}
//******************************************
int searchkey(char *word,struct key tab[],int n) // 匹配關鍵字
{
int cond;
int i;
for(i=0;i<n;i++)
{cond = strcmp(word,tab[i].word);
if ( cond== 0 )
return i;
}
return -1;
}
//**********************************************
int searchsymbol(char c,struct symbol tab[],int n) // 匹配符號
{
int i;
for(i=0;i<n;i++)
{ if(c==tab[i].c)
return i;
}
return -1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -