【问题标题】:Lexical Analyzer code in CC中的词法分析器代码
【发布时间】:2012-05-04 11:07:39
【问题描述】:

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

所以对于这个例子 ( sum + 47 ) / total 这应该是输出

下一个标记是:25 下一个词位是 ( 下一个标记是:11 下一个词位是 sum 下一个标记是:21 下一个词位是 + 下一个标记是:10 下一个词位是 47 下一个标记是:26 下一个词位是 ) 下一个标记是:24 下一个词位是 / 下一个标记是:11 Next lexeme is total 下一个标记是:-1 下一个词位是 EOF

【问题讨论】:

  • 您的编译器错误肯定比您在此处发布的信息更能说明问题——例如函数名称或行号,这将引导您准确了解它所抱怨的内容。
  • c++ 编译器不支持 implicint int。需要行号和更好的代码示例。
  • 您应该感谢这本书的代码直接复制自:Robert Sebesta 的编程语言概念。来自第 4.2 节的 front.c 文件

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


【解决方案1】:
   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);
      }
   }

【讨论】:

  • 此外,main() 应该取 void 或 int+char**。
  • 在 C++ 中;它们是相同的 int main() 和 int main(void)
  • @YasarIslam:这个问题没有被标记为 C++。
  • @Alex 但是,他用 C++ 编译器编译。
【解决方案2】:

Main 声明不正确。

要么接受命令行参数:

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

    return 0;
}

或者没有:

int main(void)
{
    return 0;
}

Answer pinched from here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-22
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多