




















|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define WORD_LENGTH 130 // 单词最大长度 #define WORD_OF_PROGRAM 1000 //最大单词数 char prog[WORD_OF_PROGRAM*WORD_LENGTH],token[WORD_LENGTH]; char ch; int syn,p,m=0,n,row; double sum =0; //类型为整数或者小数的时候,用于保存源数据 int syn_of_rwtab; //遍历关键字数组 int locate_line; //单词在行中的位置 char *rwtab[18]={"program","const","var","integer", "decimal","string","procedure","begin", "end ","if","then","else","while","do", "call","read","write","not"}; //保存关键字 void getToken(){ /* 这里一共有7类,每一类都有一个if判断 */ for(n=0;n<WORD_LENGTH;n++) token[n]=NULL; ch=prog[p++]; //****************第6类 分隔符***********************************// if(ch==' '||ch==';'|| ch=='{'||ch=='}'|| ch=='('||ch==')'){ syn = 6; token[0] = ch; } //***************2 标识符 1 关键字*********************************// else if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||ch=='_') //可能是标示符或者变量名 { m=0; while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||ch=='_') { token[m++]=ch; ch=prog[p++]; } token[m++]='\0'; p--; syn=2; for(n=0;n<18;n++) //将识别出来的字符和已定义的标示符作比较, if(strcmp(token,rwtab[n])==0) { syn=1; syn_of_rwtab=n; break; } } //*****************3 整数 4小数********************************// else if((ch>='0'&&ch<='9')) { bool flag = false; //是否是小数 sum=0; while((ch>='0'&&ch<='9')) { sum=sum*10+ch-'0'; ch=prog[p++]; } if(ch=='.'){ flag = true; ch=prog[p++]; double tag = 0.1; //记录小数的位数 while((ch>='0' && ch<='9')){ sum+=(ch-'0')*tag; tag=tag*0.1; ch=prog[p++]; } }//if p--; if(flag) syn = 4; else syn = 3; if(sum>32767) syn=-1; } //********************5 判断是不是字符串****************************// else if(ch=='\"'){ syn = 5; m=0; token[m++] = ch; while((ch=prog[p++])!='\"') token[m++] = ch; token[m] = ch; // p--; } //*******************7 运算符*******************// else switch(ch) { case'<': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='>') { syn=7; token[m++]=ch; } else if(ch=='=') { syn=7; token[m++]=ch; } else { syn=7; p--; } break; case'>': m=0; token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=7; token[m++]=ch; } else { syn=7; p--; } break; case':': m=0;token[m++]=ch; ch=prog[p++]; if(ch=='=') { syn=7; token[m++]=ch; } else { syn=7; p--; } break; case'*':syn=7;token[0]=ch;break; case'/':syn=7;token[0]=ch;break; case'+':syn=7;token[0]=ch;break; case'-':syn=7;token[0]=ch;break; case'=':syn=7;token[0]=ch;break; case'#':syn=0;token[0]=ch;break; case'\n':syn=-2;locate_line=0;break; default: syn=-1;break; } } int main() { p=0; row=1; cout<<"Please input string:"<<endl; do { cin.get(ch); prog[p++]=ch; } while(ch!='#'); int temp = 0; //不区分大小写,全部转换成小写。 while(prog[temp]!='#'){ if(prog[temp]<='Z' && prog[temp]>='A') prog[temp]+='a'-'A'; temp++; } p=0; do { getToken(); locate_line++; switch(syn) { case 1: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<rwtab[syn_of_rwtab]<<")"<<endl;break; case 2: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case 5: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token<<")"<<endl; break; case 6: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<token[0]<<")"<<endl; break; case 3: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<sum<<")"<<endl; break; case 4: cout<<row<<" "<<locate_line<<" "<<"("<<syn<<","<<sum<<")"<<endl; break; case -1: cout<<"Error in row "<<row<<"!"<<endl; break; case -2: row=row++;break; } } while (syn!=0); } |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。