2012-10-07 95 views
-3

基本上這是一個程序,我拿一些代碼的文本文件,並採取每個字符,並使其成爲一個令牌或使其中包含的其他字符成爲令牌就像一個變量,這部分工作我知道,因爲我已經使用這個代碼的另一個項目,我只是重複使用。問題是,當我試圖獲取令牌scanner.c創建並將其返回到另一個文件它是說我有一個錯誤「錯誤:預期的標識符或'('之前'TOKEN'」。我不知道錯誤的位置。這是我的scanner.c文件,我也發佈了.h文件,其中定義了標記。錯誤:預期的標識符或'('之前的'TOKEN'

#include <stdio.h> 
#include <string.h> 
#include "parser.h" 


*TOKEN parseString(char *token); 
*TOKEN parseChar(char token); 

*TOKEN scan(FILE *input_file) 
{  
    int stateTable[3][122]; 
    int i = 0; 
    int j = 0; 
    for(i=0; i < 3; i++)//init to 0 
    { 
     for (j=0; j < 122; j++) 
     { 
     stateTable[i][j] = 0; 
     } 
    } 

    for(i=48; i < 57; i++)//all numbers [0-9] 
    { 
     stateTable[1][i] = 3; 
     stateTable[3][i] = 3; 
    } 

    for(i=97; i < 122; i++)//all alpha [a-z] 
    { 
     stateTable[1][i] = 2; 
     stateTable[2][i] = 2; 
    } 

    stateTable[1][10] = 1;// \n 
    stateTable[1][32] = 1;// space 
    stateTable[1][40] = 1;// (
    stateTable[1][41] = 1;//) 
    stateTable[1][42] = 1;// * 
    stateTable[1][43] = 1;// + 
    stateTable[1][45] = 1;// - 
    stateTable[1][47] = 1;///
    stateTable[1][59] = 1;// ; 
    stateTable[1][61] = 1;// = 

    int state = 0; 
    int index = 0; 
    char temp[20]; 
    char token; 


     token = fgetc(input_file); 
     state = stateTable[1][(int) token]; 

     if (state == 2 || state == 3)//num or alpha 
     { 
     temp[index] = token; 
     index++; 
      scan(input_file); 
     } 
     else if (state = 1) 
     { 
      if (index >= 1)//digit or identifier 
      { 
       temp[index] = '\0'; 
       return parseString(&temp[0]); 
       temp[0] = '\0'; 
      } 
      else 
       return parseChar(token); 

      if(token == ';' ||token == ')') 
       return parseChar(token); 

      index = 0; 
     } 

} 

*TOKEN parseString(char *token) 
{ 
    TOKEN *temp = malloc(sizeof(TOKEN)); 
    if(strcmp("repeat",token) == 0) 
     &temp.type = 4; 
    else if(strcmp("print",token) == 0) 
     &temp.type = 5; 
    else if(isdigit(token[0])) 
    { 
     &temp.type = 12; 
     &temp.attribute = token[0]; 
    } 
    else if(strcmp(token, "") != 0) 
    { 
     &temp.type = 10; 
     &temp.attribute = token; 
    } 

    return temp; 
} 

*TOKEN parseChar(char token) 
{ 
    TOKEN *temp = malloc(sizeof(TOKEN)); 
    if(token == '+' || token == '-') 
    { 
     &temp.type = 14; 
     &temp.attribute = token; 

    } 
    else if(token == '/' || token == '*' || token == '%') 
    { 
     &temp.type = 13; 
     &temp.attribute = token; 
    } 
    else if(token == '=') 
     &temp.type = 3; 
    else if(token == ';') 
     &temp.type = 17; 
    else if(token == '(') 
     &temp.type = 15; 
    else if(token ==')') 
     &temp.type = 16; 

    return temp; 

} 

下面是parser.h文件,它具有TOKEN它描述。

#ifndef _parser_h 
#define _parser_h 


typedef enum token_type 
{ 
    Id, 
    keyword, 
    num, 
    addOp, 
    multOp, 
    assignment, 
    semicolon, 
    lparen, 
    rparen 

}TOKEN_TYPE; 

typedef struct token{ 
    TOKEN_TYPE type; 
    char* attribute; 
}TOKEN; 

typedef enum node_type 
{ 
    PROGRAM, 
    statement, 
    assignStmt, 
    repeatStmt, 
    printStmt, 
    exp, 
    term, 
    factor 
}NODE_TYPE; 

#endif 

它只是口口聲聲說在以往任何時候我聲明,我缺少「(」前的TOKEN函數名。

任何幫助將是偉大的。

+1

你的意思'TOKEN *'? – chris

+0

這擺脫了'('錯誤,但現在它不承認我的token.type或token.attribute btw謝謝 – bigfetz

回答

1

應該是 TOKEN * parseChar(炭令牌)的 代替 * TOKEN parseChar(炭令牌)

和 TEMP->類型= 4; 而不是 & temp.type = 4;

+0

謝謝我現在只有幾個更多的錯誤 – bigfetz

1

如上所述:應該是TOKEN*

但你也必須解決一些其他問題。

TOKEN *temp ; 

temp->type(*temp).type代替(&temp).type

+0

謝謝,這有助於很多 – bigfetz

相關問題