0

我使用 Visual Studio 2010 for C++ 我为 C 编程的词法分析器实现了代码,但我收到错误消息“缺少类型说明符 - 假定为 int。注意:C++ 不支持默认 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 回答