error: se esperaba ‘=’, ‘,’, ‘;’, ‘asm’ o ‘__attribute__’ antes de ‘{‘ token

Estoy trabajando en un proyecto que analiza un archivo de texto que se supone que es un progtwig codificado simple. El problema es que cuando bash completar el progtwig aparece este error:

In file included from driver.c:10: parser.c: In function 'Statement': parser.c:24: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:153: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:159: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:167: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:176: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:185: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:194: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:201: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token parser.c:209: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token driver.c:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token driver.c:50: error: old-style parameter declarations in prototyped function definition driver.c:50: error: expected '{' at end of input 

No estoy familiarizado con este error y no estoy seguro de cómo solucionarlo.

Aquí está mi archivo parser.c en el que está ocurriendo el error:

 #include  #include  #include "parser.h" AST_NODE* Program(AST_NODE* node); AST_NODE* Statement(AST_NODE* node) AST_NODE* AssignStmt(AST_NODE* node); AST_NODE* Print(AST_NODE *node); AST_NODE* Repeat(AST_NODE* node); AST_NODE* Exp(AST_NODE* node); AST_NODE* Factor(AST_NODE* node); AST_NODE* Term(AST_NODE* node); AST_NODE* parser(TOKEN* token,AST_NODE* node, FILE* input_file) { AST_NODE temp = malloc(sizeof(AST_NODE*)); if(token->type == Id) { temp-> tok = token; node -> child1 = temp; return node }else if(token->type == keyword) { if(strcmp(node->attribute, "print") == 0) { temp -> type = print; node -> child1 = temp; return node; } else if(strcmp(node->attribute, "repeat") == 0) { temp -> type = repeat; node -> child1 = temp; return node; } return node->prev; }else if(token->type == num) { temp->type = factor; temp->tok = token; AST_NODE temp2 = Exp(Term(temp)); node-> child3 = temp2 return node;//back to ID->term->exp then to either print repeat or assignment }else if(token->type == addOp) { temp-> tok = token; node-> child2 = temp; return node; }else if(token->type == multOp) { temp-> tok = token; node-> child2 = temp; return node; }else if(token->type == assignment) { temp->type = assignStmt; temp->tok = token; node->child2 = temp; return node; }else if(token->type == semicolon) { temp-> type = assignStmt; temp-> tok = token; if(node->type == keyword) { node->child3 = temp; }else { node->child4 = temp; } return node; }else if(token->type == lparen) { temp -> tok = token; if(node->type == repeat) node->child2 = temp; else node->child1 = temp; return node = node->prev; }else if(token->type == rparen) { temp -> tok = token; if(node->type == repeat) node->child4 = temp; else node->child3 = temp; return node; }else if(token->type == newLine) { while(node->type != program) { node = node->prev; } return node; }else{ if(token->type == Id) { AST_NODE temp2 = AssignStmt(Program(node)); temp->type = Id; temp->tok = token temp->prev = temp2; temp2-> child1 = temp; return temp2; }else if(strcmp(token->attribute,"print")) { AST_NODE temp2 = Print(Program(node)); temp->type = print; temp->tok = token temp->prev = temp2; temp2-> child1 = temp; return temp2; }else if(strcmp(token->attribute,"repeat")) { AST_NODE temp2 = Repeat(Program(node)); temp->type = repeat; temp->tok = token temp->prev = temp2; temp2-> child1 = temp; return temp2; } printf("error"); return NULL; } } AST_NODE* Program(AST_NODE* node) { node->type = program; Statement(node); return node; } AST_NODE* Statement(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp-> type = statement; temp-> prev = node; node->child1-> temp; return temp; } AST_NODE* AssignStmt(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp->type = assignStmt; temp-> prev = node; node->child1-> temp; return temp; } AST_NODE* Print(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp->type = print; temp-> prev = node; node->child1-> temp; return node; } AST_NODE* Repeat(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp->type = repeat; temp-> prev = node; node->child1-> temp; return node; } AST_NODE* Exp(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp->type = exp; temp->child1-> node; return temp; } AST_NODE* factor(AST_NODE* node) { AST_NODE Temp = malloc(sizeof(AST_NODE*)); temp->type = factor; node->child1-> temp; return temp; } AST_NODE* Term(AST_NODE* node) { AST_NODE temp = malloc(sizeof(AST_NODE*)); temp->type = term; temp->child1-> node; return temp; } 

Aquí está mi archivo driver.c donde también aparece el error “declaraciones de parámetros de estilo antiguo en la definición de la función de prototipo esperada ‘{‘ al final de la entrada”. Esto también me es muy poco familiar.

 #include  #include "parser.c" #include "parser.h" AST_NODE* parser(TOKEN* token,AST_NODE node, FILE *input_file); int main(void) { TREE *current = 0; FILE *input_file = fopen("test.txt", "r"); TOKEN *token = (TOKEN*) malloc(sizeof(TOKEN)); TOKEN *tok = (TOKEN*) malloc(sizeof(TOKEN)); AST_NODE* node = malloc(sizeof(AST_NODE)); while(!feof(input_file)) { token = scan(input_file); if(token->type != null) { parser(token,node,input_file); printf("%s", token->attribute); if(token->checkR == ';') { tok->type = semicolon; tok->attribute = ";"; parser(tok,node,input_file); }if(token->checkR == ')') { tok->type = rparen; tok->attribute = ")"; parser(tok,node,input_file); } } } fclose(input_file); return 0; } 

Aquí está mi archivo parser.h donde declaro mi TOKEN y mi AST_NODE para crear mi árbol y formar mis fichas para rellenar el árbol.

 #ifndef _parser_h #define _parser_h typedef enum token_type { null, Id, keyword, num, addOp, multOp, assignment, semicolon, lparen, rparen, newLine }TOKEN_TYPE; typedef struct token{ int type; char *attribute; char checkR; }TOKEN; typedef enum node_type { program, statement, assignStmt, print, repeat, exp, factor, term }NODE_TYPE; typedef struct ast_node{ NODE_TYPE type; TOKEN *tok; struct AST_NODE *prev; struct AST_NODE *child1; struct AST_NODE *child2; struct AST_NODE *child3; struct AST_NODE *child4; struct AST_NODE *child5; }AST_NODE; #endif 

Hay un archivo más llamado scanner.c pero sé que funciona perfectamente porque lo he probado en todas las entradas posibles y no tengo problemas.

Si alguien pudiera ayudarme lo apreciaría mucho.

 AST_NODE* Statement(AST_NODE* node) 

falta un punto y coma (una pista importante fue el mensaje de error “En la función ‘Declaración’: …”) y también lo es la línea 24,

  return node 

(Una vez que los arregles, encontrarás otros problemas, algunos de los cuales se mencionan aquí en otros).

  1. Parece que estás incluyendo un archivo C de otra. #include normalmente debería usarse solo con archivos de encabezado.

  2. Dentro de la definición de struct ast_node se refiere a la struct AST_NODE , que no existe. C es sensible a mayúsculas y minúsculas.

cerca del final de la función de analizador, te perdiste un ‘}’

Ocurre un error en sus declaraciones de funciones, mire la siguiente oración! Necesita un punto y coma


 AST_NODE* Statement(AST_NODE* node)