{
int j=0;
sr=0; /*全局变量sr是str[]的指示器*/ do {
if(set[j]==' '|| set[j]=='\\n') {
while(set[j]==' ' || set[j]=='\\n') /*扫描到有连续的空格或换行符*/
{ if(set[j]=='\\n') line++;
j++; }
str[sr]=' '; /*用一个空格代替扫描到的连续空格和换行符放入str[]*/ sr++;
} else {
str[sr]=set[j]; /*若当前字符不为空格或换行符就直接放入str[]*/ sr++; j++; }
}while(set[j]!='\\0'); str[sr]='\\0'; }
char GetChar() /*把字符读入全局变量ch中,指示器sr前移*/ {
ch=str[sr]; sr++;
return(str[sr-1]); }
void GetBC() /*开始读入符号,直至第一个不为空格*/ {
while(ch==' ') {
ch=GetChar(); } }
void Concat() /*把ch中的字符放入strtaken[]*/ {
strtaken[to]=ch;
to++; /*全局变量to是strtaken的指示器*/
strtaken[to]='\\0'; }
int IsLetter() /*判断是否为字母*/ {
if((ch>='a' && ch<='z')||(ch>='A' && ch<='Z')) return(1); else return(0); }
int IsDigit() /*判断是否为数字*/ {
if(ch>='0' && ch<='9') return(1); else return(0); }
int Reserve() /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回-*/ {
int i,k=0; for(i=0;i<=12;i++) {
if(stricmp(strtaken,keyword[i].name)==0) { k=1;
Words[dcount].num=keyword[i].kind; strcpy(Words[dcount].letters,\);
dcount++;
return(keyword[i].kind); } } if(k!=1) return(-1); }
void Retract() /*指示器sr回调一个字符位置,把ch置为空*/ { sr--; ch=' '; }
int InsertId() {
int i,k; for(i=0;i k=strcmp(strtaken,sign[i]); if(k==0) return(i); } strcpy(sign[id],strtaken); /*插入标识符*/ Words[dcount].num=13; strcpy(Words[dcount].letters,strtaken); id++;dcount++; return(id-1); } int InsertConst() { int i,k; for(i=0;i k=strcmp(strtaken,constant[i]); if(k==0) return(i); } strcpy(constant[st],strtaken);/*插入常数*/ Words[dcount].num=14; strcpy(Words[dcount].letters,strtaken); st++;dcount++; return(st-1); } void analysis() { int value; reflesh(); /*清空strtaken数组*/ pre1(); /*预处理,使注释内容换成单个空格,放回set[]中*/ pre2(); /*预处理,使set[]中连续的空格置换成单个空格,并把set[]的内容放到str[]中*/ sr=0; GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ GetBC(); /*读取第一个字符*/ while(ch!='\\0') /*当不等于结束符,继续执行*/ { if(IsLetter())//标识符和关键字判定 { while(IsLetter() || IsDigit()) /*若第一个是字符,继续读取,直到出现空格*/ { Concat(); GetChar(); /*把字符读入全局变量ch中,指示器sr前移*/ } Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ value=Reserve(); /*对strtaken中的字符串查找保留字表,若是则返回它的编码,否则返回-*/ if(value==-1) /*如果返回值是-,那就是标识符,把它输出*/ { InsertId(); /*插入标识符*/ } reflesh(); } else if(IsDigit()) { while(IsDigit()) /*否则,若第一个是数字,继续读取,直到出现空格*/ { Concat(); /*把ch中的字符放入strtaken[]*/ GetChar(); } Retract(); /*指示器sr回调一个字符位置,把ch置为空*/ InsertConst(); /*插入常数,返回类型为int*/ //printf(\ //getchar(); reflesh(); } else switch(ch) /*否则,若是下面的符号*/ { case'+': case'-': case'(': case')': case',': case';': case'=': case'>': case'<':
相关推荐: