2012-05-04 3 views
0

im using visual studio 2010 для C++ i реализовал код для лексического анализатора для программирования на C, но я получил сообщение об ошибке: «Отсутствует спецификатор типа - предполагается int. Примечание: C++ не поддерживает default-int» что-то не так с моим кодом? или мне просто нужно сменить компилятор? здесь кодКод Lexical Analyzer в 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

Вы должны дать кредит, чтобы забронировать этот код был скопирован непосредственно из: Концепции языков программирования Роберт Себесто. front.c из раздела 4.2 –

ответ

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

в C++; те же int main() и int main (void) – iyasar

+0

omg thanks (y)! –

1

Главная неправильно объявлена.

Либо он принимает параметры командной строки:

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

    return 0; 
} 

или нет:

int main(void) 
{ 
    return 0; 
} 

Answer pinched from here