2012-05-04 38 views
0

即時通訊使用visual studio 2010 for C++我爲C編程實現了一個詞法分析器的代碼,但是我得到一個錯誤,提示「缺少類型說明符 - int假定。注意:C++不支持default-int」我的代碼有什麼問題嗎?或者我只需要改變編譯器? 這裏是這被假設是所述輸出Lexical Analyzer code in C

下一個標記是代碼

#include <stdio.h> 
    #include <ctype.h> 

    //Global variables 
    int charClass; 
    char lexeme [100]; 
    char nextChar; 
    int lexLen; 
    int token; 
    int nextToken; 
    FILE *in_fp, *fopen(); 

    // Function Declarations 
    void addChar(); 
    void getChar(); 
    void getNonBlank(); 
    int lex(); 

    //Character classes 
    #define LETTER 0 
    #define DIGIT 1 
    #define UNKNOWN 99 

    //Token codes 
    #define INT_LIT 10 
    #define IDENT 11 
    #define ASSIGN_OP 20 
    #define ADD_OP 21 
    #define SUB_OP 22 
    #define MULT_OP 23 
    #define DIV_OP 24 
    #define LEFT_PAREN 25 
    #define RIGHT_PAREN 26 

    //Main 
     main(){ 
     if ((in_fp = fopen("front.in", "r")) == NULL) 
      printf("ERROR - cannot open front.in \n"); 
     else{ 
      getChar(); 
      do { 
       lex(); 
      }while (nextToken != EOF); 
      } 
     } 

     // lookUp 

     int lookup(char ch){ 
     switch(ch){ 
     case '(': 
      addChar(); 
      nextToken = LEFT_PAREN; 
      break; 

     case ')': 
      addChar(); 
      nextToken = RIGHT_PAREN; 
      break; 

     case '+': 
      addChar(); 
      nextToken = ADD_OP; 
      break; 

     case'-': 
      addChar(); 
      nextToken = SUB_OP; 
      break; 

     case'*': 
      addChar(); 
      nextToken = MULT_OP; 
      break; 

     case'/': 
      addChar(); 
      nextToken = DIV_OP; 
       break; 

     default: 
      addChar(); 
      nextToken = EOF; 
      break; 
     } 
     return nextToken; 
     } 
     //AddChar 

     void addChar(){ 
      if (lexLen <= 98) { 
       lexeme[lexLen++] = nextChar; 
       lexeme[lexLen] = 0; 
      } 
      else 
       printf("Error - lexeme is too long \n"); 
     } 

     //getChar 
     void getChar(){ 
      if ((nextChar = getc(in_fp)) != EOF) { 
       if (isalpha(nextChar)) 
        charClass = LETTER; 
       else if (isdigit(nextChar)) 
        charClass = DIGIT; 
       else charClass = UNKNOWN; 
      } 
      else 
       charClass = EOF; 
     } 
     // getNonBlank 
     void getNonBlank(){ 
      while (isspace(nextChar)) 
       getChar(); 
     } 
     //lex 
     int lex(){ 
      lexLen = 0; 
      getNonBlank(); 
      switch (charClass){ 
      case LETTER: 
        addChar(); 
        getChar(); 
        while (charClass == LETTER || charClass ==     DIGIT){ 
         addChar(); 
         getChar(); 
        } 
        nextToken = IDENT; 
        break; 
        // parse ints lits 
       case DIGIT: 
        addChar(); 
        getChar(); 
        while (charClass == DIGIT){ 
         addChar(); 
         getChar(); 
        } 
        nextToken = INT_LIT; 
        break; 

       //pares and ops 
       case UNKNOWN: 
        lookup(nextChar); 
        getChar(); 
        break; 

        //EOF 
       case EOF: 
        nextToken = EOF; 
        lexeme[0] = 'E'; 
        lexeme[1] = 'O'; 
        lexeme[2] = 'F'; 
        lexeme[3] = 0; 
        break; 
      } 
     // end of switch 
      printf("Next toke is: %d, next lexeme is %s\n",nextToken, lexeme); 
      return nextToken; 
     } 

所以對於該示例(總和+ 47)/總 :25下一個詞位是( 下一個標記是:11接下來詞位是總和 下一個標記是:21接着詞位是+ 下一個標記是:10下詞位是47 下一個標記是:26接着詞位是) 下一個標記是:24下詞位是/ 下一個標記是:11下一個詞位總計爲 下一個詞條爲:-1下一個詞位是EOF

+0

當然你的編譯錯誤,告訴你,超過你已經張貼在這裏 - 就像函數名或行號一樣,它會引導你完全抱怨它。 – mah

+0

C++編譯器不支持implicint int。需要行號和更好的代碼示例是切割。 – iyasar

+0

您應該認爲書中的代碼是直接從Robert Sebesta編程語言的概念中複製的。 4.2節的front.c文件 –

回答

2
main(){ 
    if ((in_fp = fopen("front.in", "r")) == NULL) 
     printf("ERROR - cannot open front.in \n"); 
    else{ 
     getChar(); 
     do { 
      lex(); 
     }while (nextToken != EOF); 
     } 
    } 

應該改變這樣的:

// return type of main should be explicitly int. 
    int main(){ 
    if ((in_fp = fopen("front.in", "r")) == NULL) 
     printf("ERROR - cannot open front.in \n"); 
    else{ 
     getChar(); 
     do { 
      lex(); 
     }while (nextToken != EOF); 
     } 
    } 
+2

此外,main()應該採用void或int + char **。 –

+0

in C++;那些是相同的int main()和int main(void) – iyasar

+0

omg謝謝(y)! –

1

主要被錯誤聲明。

要麼需要命令行參數:

int main(int argc, char *argv[]) 
{ 

    return 0; 
} 

,或者不:

int main(void) 
{ 
    return 0; 
} 

Answer pinched from here