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

📄 parse.c

📁 该程序能够实现简单的c语言词法
💻 C
📖 第 1 页 / 共 5 页
字号:
                         while(ch != ' '&&ch!='\n')
                            ch = fgetc(fp);

                   }
                   fseek(fp,-1L,1);
                   if(lookkey(sign) != -1)/*判断该标示符是否为关键字  */
                   {
                      int p = lookkey(sign);
                      if(p == 3)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_char;
                      }
                      else if(p== 7)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_do;
                      }
                      else if(p== 8)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_double;
                      }
                      else if(p== 9)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_else;
                      }
                      else if(p== 12)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_float;
                      }
                      else if(p== 13)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_for;
                      }
                      else if(p== 15)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_if;
                      }
                      else if(p== 16)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_int;
                      }
                      else if(p== 17)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_long;
                      }
                      else if(p== 29)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_void;
                      }
                      else if(p== 31)
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return symbol_while;
                      }
                      else
                      {
                        printf("(key,%s)\n",sign);
                        fprintf(output,"(key,%d)\n",sign);
                        return word_key;
                       }
                   }
                   else
                   {
                           int p = findsymbol(sign);/*判断该标示符是否在符号表中,p用来表示符号表索引*/
                           if(p==-1)
                           {
                                   p = insert(sign,symbol_mark_ID);
                                   fprintf(chart,"%d\t%s\t\t\tnull\n",index-1,sign);
                           }
                           printf("(id,%d)\n",p);
                           fprintf(output,"(id,%d)\n",p);
                           return p+1000;
                   }  
                }
                else if(lookoperater(ch)==0)/*当字符为操作符时,执行以下操作 */
                {
                        char secondchar = fgetc(fp);
                        if(secondchar == '|'&&ch == '|')/*当字符为|,&,+,-,>,<,=时,执行相应超前扫描  */
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return or;

                        }
                        else if(secondchar == '&'&&ch == '&')
                        {
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                printf("(operator,%c%c)\n",ch,secondchar);
                                return and;
                        }
                        else if(secondchar == '+'&&ch == '+')
                        {
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                printf("(operator,%c%c)\n",ch,secondchar);
                                return add_add;
                        }
                        else if(secondchar == '-'&&ch == '-')
                        {
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                printf("(operator,%c%c)\n",ch,secondchar);
                                return minus_minus;
                        }
                        else if(secondchar == '>'&&ch == '>')
                        {
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                printf("(operator,%c%c)\n",ch,secondchar);
                        }
                        else if(secondchar == '<'&&ch == '<')
                        {
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                printf("(operator,%c%c)\n",ch,secondchar);
                        }
                        else if(ch=='>'&&secondchar == '=')
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return great_equal;
                        }
                        else if(ch == '<'&&secondchar == '=')
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return small_equal;
                        }
                        else if(ch == '!'&&secondchar == '=')
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return not_equal;
                        }
                        else if(ch == '='&&secondchar == '=')
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return equal_equal;
                        }
                        else if(secondchar == '=')
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                        }
                        else if(ch =='+')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return add;
                        }
                        else if(ch =='-')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return minus;
                        }

                        else if(ch =='*')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return multy;
                        }
                        else if(ch =='<')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return small;
                        }
                        else if(ch =='>')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return great;
                        }
                        else if(ch =='=')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return equal;
                        }
                        else if(ch =='!')
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return not;
                        }
                        else
                        {
                            fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                        }
                        return word_other;
                }
                else if(ch == '/')/*当字符为斜杆时,执行以下操作  */
                {
                        char secondchar = fgetc(fp);
                        if(secondchar == '*')/*当接着读入的字符为*时,则以后的字符都为注释*/
                        {
                                char a =fgetc(fp);
                                ch = fgetc(fp);
                                while(!(ch == '*'&& a == '/'))
                                {
                                        fseek(fp,-1L,1);
                                        ch = fgetc(fp);
                                        a =fgetc(fp);
                                }
                        }
                        else if(secondchar == '=')/*当接着的字符为=,则为操作符/= */
                        {
                                printf("(operator,%c%c)\n",ch,secondchar);
                                fprintf(output,"(operator,%c%c)\n",ch,secondchar);
                                return word_other;
                        }
                        else
                        {
                                fprintf(output,"(operator,%c)\n",ch);
                                printf("(operator,%c)\n",ch);
                                fseek(fp,-1L,1);
                                return divide;

                        }


                }
                else if(ch == '"')/*当字符为双引号时 */
                {
                        char n = fgetc(fp);
                        fseek(fp,-2L,1);
                        if(n == '\''||n=='\\')
                        /*当双引号前面的字符为单引号或反斜杠时,将字符输出  */
                        {
                                ch = fgetc(fp);
                            fprintf(output,"(divide,%c)\n",ch);
                            printf("(divide,%c)\n",ch);
                        }
                        else/*否则将双引号后面的字符当作字符串处理,直到发现另一个双引号为止 */
                        { 
                                char string[200]={'\0'};
                            int c =0;
                            ch = fgetc(fp);
                                fprintf(output,"(divide,%c)\n",ch);
                            printf("(divide,%c)\n",ch);
                                ch = fgetc(fp);
                            while(ch != '"')/*当两个双引号之间内容分行写时,报错  */
                                {
                                     if(ch == '\n')
                                         {
                                           printf("erro:语句输出有错,只能在一行上输出,错误在%d行\n",linenumber);
                                           fprintf(erro,"erro:语句输出有错,只能在一行上输出,错误在%d行\n",linenumber);
                                           ch =fgetc(fp);
                                           linenumber++;
                                           break;
                                         }
                                         if(ch =='\\')
                                         {
                                                 string[c] = ch;
                                             c++;
                                                 ch =fgetc(fp);
                                         }
                                         string[c] = ch;
                                         c++;
                                         ch =fgetc(fp);
                                }
                            printf("(string,%s)\n",string);
                            fprintf(output,"(strings,%s)\n",string);
                            fprintf(output,"(divide,%c)\n",ch);
                            printf("(divide,%c)\n",ch);
                        }
                        return word_string;
                        
                }
            else if(lookletter(ch) ==0)/*当字符为c语言中的合法字符是时,输出字符 */
                {
                       if(ch == '(')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return leftpar;
                        }
                       else if(ch == ')')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return rightpar;
                        }
                        else if(ch == '[')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return leftmiddle;
                        }
                        else if(ch == ']')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return rightmiddle;
                        }
                        else if(ch == '{')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return leftbig;
                        }
                        else if(ch == '}')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return rightbig;
                        }
                        else if(ch == ';')
                       {
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return fenhao;
                        }
                        fprintf(output,"(divide,%c)\n",ch);
                        printf("(divide,%c)\n",ch);
                        return word_divide;

                }
                else if(ch ==EOF)
                  return -1;

                else
                {

⌨️ 快捷键说明

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