Странная ошибка компилятора в коде парсера - PullRequest
0 голосов
/ 06 января 2012

parser.h

enum { PLUS, MINUS, DIVIDE, MULTIPLY, NUMBER, END } type;

int token;

/* parsing functions */
void parse_token (void);

parser.c

void get_token (void)
{       
     token++;   
     parse_token(); /* LINE 11 */
}

void parse_token (void) /* LINE 14 */
{
    if ( strchr ("1234567890.", token) )
        type = NUMBER;

    else if ( strchr ("+", token) )
        type = PLUS;

    else if ( strchr ("-", token) )
        type = MINUS;

    else if ( strchr ("/", token) )
        type = DIVIDE;

    else if ( strchr ("*",token) )
        type = MULTIPLY;

    else if ( token == '\0' )
        type = END;
    else 
        show_error(strcat("Couldn't parse token : ", token));
}

Ошибки

parser.c:14:6: warning: conflicting types for ‘parse_token’ [enabled by default]
parser.c:11:2: note: previous implicit declaration of ‘parse_token’ was here
parser.c: In function ‘parse_token’:
parser.c:16:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:17:3: error: ‘type’ undeclared (first use in this function)
parser.c:17:3: note: each undeclared identifier is reported only once for each function it appears in
parser.c:17:10: error: ‘NUMBER’ undeclared (first use in this function)
parser.c:19:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:20:10: error: ‘PLUS’ undeclared (first use in this function)
parser.c:22:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:23:10: error: ‘MINUS’ undeclared (first use in this function)
parser.c:25:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:26:10: error: ‘DIVIDE’ undeclared (first use in this function)
parser.c:28:2: warning: passing argument 2 of ‘strchr’ makes integer from pointer without a cast [enabled by default]
/usr/include/string.h:235:14: note: expected ‘int’ but argument is of type ‘char *’
parser.c:29:10: error: ‘MULTIPLY’ undeclared (first use in this function)
parser.c:32:10: error: ‘END’ undeclared (first use in this function)
parser.c: In function ‘show_error’:
parser.c:40:2: warning: incompatible implicit declaration of built-in function ‘exit’ [enabled by default]

Я совершенно сбит с толку. :. (

Любая помощь?

Ответы [ 2 ]

5 голосов
/ 06 января 2012

Когда вы получите его для компиляции (включив заголовок, как сказал Лучиан Григоре), вы обнаружите, что вы не можете сделать strcat() для константной строки.

Константная строка выделенав постоянной памяти, и не может быть изменено.И даже если бы вы могли изменить его, вы бы перезаписали другие вещи в памяти.

3 голосов
/ 06 января 2012

Вы не включаете свой заголовок, поэтому у отдела переводов нет возможности узнать о объявлениях type и token.

Вам необходимо:

#include "Parser.h"

в начале файла реализации.

...