0

C++ 用の Visual Studio 2010 を使用している私は、C プログラミング用の語彙アナライザーのコードを実装しましたが、「型指定子がありません - int が想定されています。注: C++ は default-int をサポートしていません」というエラーが表示されました。私のコードに何か問題がありますか? または、コンパイラを変更する必要がありますか?ここにコードがあります

    #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;
       }

したがって、この例では ( sum + 47 ) / total これが出力であると想定されます

次のトークンは: 25 次の語彙素は ( 次のトークンは: 11 次の語彙素は sum 次のトークンは: 21 次の語彙素は + 次のトークンは: 10 次の語彙素は 47 次のトークンは: 26 次の語彙素は ) 次のトークンは: 24次の語彙素は / 次のトークンは: 11 次の語彙素は合計です 次のトークンは: -1 次の語彙素は EOF です

4

2 に答える 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);
      }
   }
于 2012-05-04T11:17:38.470 に答える
1

Main が正しく宣言されていません。

コマンドラインパラメータを取ります:

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

    return 0;
}

またはそうではありません:

int main(void)
{
    return 0;
}

ここからつまんだ答え

于 2012-05-04T12:49:40.473 に答える