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

📄 200218033i

📁 词法分析程序 程序当前目录里自己建立一个文本文档
💻
字号:
      1 // 程序当前目录里自己建立一个文本文档,取名为infile.txt,所有需要分析的程
         序都写在此文本文档里,注意,程序的结尾必须以"@"标志符结束。程序结果输出
         在同目录,文件名为outfile.txt,此文件为自动生成。
      2 #include <stdio.h>
      3 #include <string.h>
      4 //#include <process.h>
      5 #define MAX 50
      6 int main()
      7 {
      8 FILE *in,*out;/*存放输入字符串和输出单词串的文件*/
      9 char arr[MAX];/*arr数组存放单词符号*/
     10 char currentchar;/*currentchar存放当前输入字符*/
     11 int i=0;/*arr数组的一个指针*/
     12 /*以读方式打开输入文件*/
     13 if((in=fopen("infile.txt","r"))==NULL)
     14 {
     15 printf("can not open file\n");
     16 exit(0);
     17 }
     18 /*以写方式打开输出文件*/
     19 if((out=fopen("outfile.txt","w"))==NULL)
     20 {
     21 printf("cannout open outfile\n");                                   22 exit(1);
     23 }
     24 //去掉开头空格
     25 currentchar=fgetc(in);
     26 while(currentchar==' ')
     27 {
     28 currentchar=fgetc(in);
     29 }
     30 int ch;
     31 while(currentchar!='@')
     32 {
     33 /*常数部分判断*/
     34 if((currentchar>='a'&&currentchar<='z')||(currentchar>='A'&&currentchar<
        ='Z')||(currentchar>='0'&&currentchar<='9')||currentchar=='('||currentch
        ar==')'||currentchar=='{'||currentchar=='}'||currentchar=='>'||currentch
        ar=='<'||currentchar==';'||currentchar==':'||currentchar=='+'||currentch
        ar=='-'||currentchar=='*'||currentchar=='/'||currentchar=='='||currentch
        ar=='!'||currentchar=='&'||(ch=currentchar)=='\n'||currentchar==' '||cur
        rentchar=='['||currentchar==']')
     35 {
     36 i=0;//清空arr字符数组
     37 if(currentchar>='0'&&currentchar<='9')
     38 {                                                    
     39 arr[i++]=currentchar;
     40 currentchar=fgetc(in);//再读入下一个字符
     41 while(currentchar>='0'&&currentchar<='9')
     42 {
     43 arr[i++]=currentchar;
     44 currentchar=fgetc(in);
     45 }
     46 if(currentchar!='.')//如果当前读入的符号不为小数点,则常数读完毕,输出此
        常数
     47 {
     48 arr[i++]='\0';
     49 fprintf(out,"%s%d,%c%s%c%s\n","(",15,'"',arr,'"',")");//格式化输出到目标
        文件,15代表种别码, arr为内码值,规定用数字本身代表
     50 }
     51 else//当前字符为小数点则继续向下读入
     52 {
     53 arr[i++]=currentchar;
     54 currentchar=fgetc(in);
     55 while(currentchar>='0'&&currentchar<='9')
     56 {
     57 arr[i++]=currentchar;
     58 currentchar=fgetc(in);
     59 }                                                                   60 arr[i++]='\0';
     61 fprintf(out,"%s%d,%c%s%c%s\n","(",15,'"',arr,'"',")");
     62 }
     63 while(currentchar==' ')
     64 {
     65 currentchar=fgetc(in);
     66 }
     67 }
     68 /*判断标识符和关键字部分*/
     69 if((currentchar>='a'&&currentchar<='z')||(currentchar>='A'&&currentchar<
        ='Z'))
     70 {
     71 i=0;//清空arr字符数组
     72 while((currentchar>='a'&&currentchar<='z')||(currentchar>='0'&&currentch
        ar<='9')||(currentchar>='A'&&currentchar<='Z'))
     73 {
     74 arr[i++]=currentchar;
     75 currentchar=fgetc(in);
     76 }
     77 //把字符数组arr和关键字表比较,判断单词串是关键字还是标识符
     78 arr[i++]='\0';
     79 if(strcmp(arr,"if")==0)
     80 fprintf(out,"%s%d,%c%s%c%s\n","(",0,'"',arr,'"',")");     
     81 else if(strcmp(arr,"else")==0)
     82 fprintf(out,"%s%d,%c%s%c%s\n","(",1,'"',arr,'"',")");
     83 else if(strcmp(arr,"while")==0)
     84 fprintf(out,"%s%d,%c%s%c%s\n","(",2,'"',arr,'"',")");
     85 else if(strcmp(arr,"do")==0)
     86 fprintf(out,"%s%d,%c%s%c%s\n","(",3,'"',arr,'"',")");
     87 else
     88 fprintf(out,"%s%d,%c%s%c%s\n","(",14,'"',arr,'"',")");
     89 }
     90 while(currentchar==' ')
     91 {
     92 currentchar=fgetc(in);
     93 }
     94 //判断标识符包括:+, -, *, /, (, ), {, }, <, >, ;, :, !=, >=, <=, ==, =.
     95 if(currentchar=='+')
     96 {
     97 fprintf(out,"%s%d,%c%c%c%s\n","(",9,'"',currentchar,'"',")");
     98 currentchar=fgetc(in);
     99 }
    100 while(currentchar==' ')
    101 {
    102 currentchar=fgetc(in);
    103 }                                       
    104 if(currentchar=='-')
    105 {
    106 fprintf(out,"%s%d,%c%c%c%s\n","(",10,'"',currentchar,'"',")");
    107 currentchar=fgetc(in);
    108 }
    109 while(currentchar==' ')
    110 {
    111 currentchar=fgetc(in);
    112 }
    113 if(currentchar=='*')
    114 {
    115 fprintf(out,"%s%d,%c%c%c%s\n","(",11,'"',currentchar,'"',")");
    116 currentchar=fgetc(in);
    117 }
    118 while(currentchar==' ')
    119 {
    120 currentchar=fgetc(in);
    121 }
    122 if(currentchar=='/')
    123 {
    124 fprintf(out,"%s%d,%c%c%c%s\n","(",12,'"',currentchar,'"',")");
    125 currentchar=fgetc(in);
    126 }                          
    127 while(currentchar==' ')
    128 {
    129 currentchar=fgetc(in);
    130 }
    131 if(currentchar=='=')
    132 {
    133 i=0;
    134 arr[i++]=currentchar;
    135 currentchar=fgetc(in);
    136 if(currentchar=='=')
    137 {
    138 arr[i++]=currentchar;
    139 arr[i++]='\0';
    140 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");
    141 currentchar=fgetc(in);
    142 }
    143 else
    144 { arr[i++]='\0';
    145 fprintf(out,"%s%d,%c%s%c%s\n","(",17,'"',arr,'"',")");
    146 }
    147 }
    148 while(currentchar==' ')
    149 {                                          
    150 currentchar=fgetc(in);
    151 }
    152 if(currentchar==';')
    153 {
    154 fprintf(out,"%s%d,%c%c%c%s\n","(",4,'"',currentchar,'"',")");
    155 currentchar=fgetc(in);
    156 }
    157 while(currentchar==' ')
    158 {
    159 currentchar=fgetc(in);
    160 }
    161 if(currentchar=='{')
    162 {
    163 fprintf(out,"%s%d,%c%c%c%s\n","(",5,'"',currentchar,'"',")");
    164 currentchar=fgetc(in);
    165 }
    166 while(currentchar==' ')
    167 {
    168 currentchar=fgetc(in);
    169 }
    170 while(currentchar=='}')
    171 {
    172 fprintf(out,"%s%d,%c%c%c%s\n","(",6,'"',currentchar,'"',")");      173 currentchar=fgetc(in);
    174 }
    175 while(currentchar==' ')
    176 {
    177 currentchar=fgetc(in);
    178 }
    179 if(currentchar=='[')
    180 {
    181 fprintf(out,"%s%d,%c%c%c%s\n","(",20,'"',currentchar,'"',")");
    182 currentchar=fgetc(in);
    183 }
    184 while(currentchar==' ')
    185 {
    186 currentchar=fgetc(in);
    187 }
    188 if(currentchar==']')
    189 {
    190 fprintf(out,"%s%d,%c%c%c%s\n","(",21,'"',currentchar,'"',")");
    191 currentchar=fgetc(in);
    192 }
    193 while(currentchar==' ')
    194 {
    195 currentchar=fgetc(in);                    
    196 }
    197 if(currentchar=='(')
    198 {
    199 fprintf(out,"%s%d,%c%c%c%s\n","(",7,'"',currentchar,'"',")");
    200 currentchar=fgetc(in);
    201 }
    202 while(currentchar==' ')
    203 {
    204 currentchar=fgetc(in);
    205 }
    206 if(currentchar==')')
    207 {
    208 fprintf(out,"%s%d,%c%c%c%s\n","(",8,'"',currentchar,'"',")");
    209 currentchar=fgetc(in);
    210 }
    211 while(currentchar==' ')
    212 {
    213 currentchar=fgetc(in);
    214 }
    215 if(currentchar==':')
    216 {
    217 i=0;
    218 arr[i++]=currentchar;                  
    219 currentchar=fgetc(in);
    220 if(currentchar==':')
    221 {
    222 arr[i++]=currentchar;
    223 arr[i++]='\0';
    224 fprintf(out,"%s%d,%c%s%c%s\n","(",18,'"',arr,'"',")");
    225 currentchar=fgetc(in);
    226 }
    227 else
    228 { arr[i++]='\0';
    229 fprintf(out,"%s%d,%c%s%c%s\n","(",16,'"',arr,'"',")");
    230 }
    231 }
    232 while(currentchar==' ')
    233 {
    234 currentchar=fgetc(in);
    235 }
    236 if(currentchar=='>')
    237 {
    238 i=0;
    239 arr[i++]=currentchar;
    240 currentchar=fgetc(in);
    241 if(currentchar=='=')                 
    242 {
    243 arr[i++]=currentchar;
    244 arr[i++]='\0';
    245 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");
    246 currentchar=fgetc(in);
    247 }
    248 else
    249 { arr[i++]='\0';
    250 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");
    251 }
    252 }
    253 while(currentchar==' ')
    254 {
    255 currentchar=fgetc(in);
    256 }
    257 if(currentchar=='<')
    258 {
    259 i=0;
    260 arr[i++]=currentchar;
    261 currentchar=fgetc(in);
    262 if(currentchar=='=')
    263 {
    264 arr[i++]=currentchar;                                    
    265 arr[i++]='\0';
    266 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");
    267 currentchar=fgetc(in);
    268 }
    269 else
    270 { arr[i++]='\0';
    271 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");
    272 }
    273 }
    274 while(currentchar==' ')
    275 {
    276 currentchar=fgetc(in);
    277 }
    278 if(currentchar=='!')
    279 {
    280 i=0;
    281 arr[i++]=currentchar;
    282 currentchar=fgetc(in);
    283 if(currentchar=='=')
    284 {
    285 arr[i++]=currentchar;
    286 arr[i++]='\0';
    287 fprintf(out,"%s%d,%c%s%c%s\n","(",13,'"',arr,'"',")");             288 currentchar=fgetc(in);
    289 }
    290 }
    291 while(currentchar==' ')
    292 {
    293 currentchar=fgetc(in);
    294 }
    295 if(currentchar=='&')
    296 {
    297 fprintf(out,"%s%d,%c%c%c%s\n","(",19,'"',currentchar,'"',")");
    298 currentchar=fgetc(in);
    299 }
    300 while(currentchar==' ')
    301 {
    302 currentchar=fgetc(in);
    303 }
    304 while((ch=currentchar)=='\n')
    305 {
    306 currentchar=fgetc(in);
    307 }
    308 while(currentchar==' ')
    309 {
    310 currentchar=fgetc(in);                                             311 }
    312 }
    313 else
    314 {
    315 fprintf(out,"%s,%c%c%c\n","error",'"',currentchar,'"');
    316 currentchar=fgetc(in);
    317 }
    318 }//结束开头while语句
    319 /*关闭文件退出*/
    320 fclose(in);
    321 fclose(out);
    322 }                                                             

⌨️ 快捷键说明

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