C中的词法分析器代码

时间:2012-05-04 11:07:39

标签: c visual-studio-2010 lexical-analysis

我正在使用visual studio 2010 for C ++我实现了一个用于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;
       }

所以对于这个例子(总和+ 47)/总计 这假设是输出

下一个标记是:25下一个lexeme是( 下一个标记是:11下一个lexeme是sum 下一个标记是:21下一个lexeme是+ 下一个标记是:10下一个lexeme是47 下一个标记是:26下一个lexeme是) 下一个标记是:24下一个lexeme是/ 下一个标记是:11下一个lexeme总计 下一个标记是:-1下一个lexeme是EOF

2 个答案:

答案 0 :(得分: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);
      }
   }

答案 1 :(得分:1)

Main声明错误。

它需要命令行参数:

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

    return 0;
}

或它没有:

int main(void)
{
    return 0;
}

Answer pinched from here