Je travaille sur un projet qui analyse un fichier texte qui est supposé être un simple programme codé. Le problème est que lorsque j'essaie de compléter le programme, j'obtiens cette erreur:
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
Je ne suis pas familier avec cette erreur et je ne sais pas comment le corriger.
Voici mon fichier parser.c dans lequel l'erreur se produit:
#include <stdio.h>
#include <stdlib.h>
#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;
}
Voici le fichier driver.c où je reçois également l'erreur "déclarations de paramètres de style ancien dans la définition de la fonction prototype attendue '{' à la fin de l'entrée". Cela aussi, je suis très peu familier avec.
#include <stdio.h>
#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;
}
Voici mon fichier parser.h où je déclare mon TOKEN et mon AST_NODE pour créer mon arbre et former mes jetons pour le remplir.
#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
Il y a encore un fichier appelé scanner.c mais je sais qu'il fonctionne parfaitement parce que je l'ai testé dans toutes les entrées possibles et que je n'ai aucun problème.
Si quelqu'un pouvait aider, je l'apprécierais beaucoup.
AST_NODE* Statement(AST_NODE* node)
il manque un point-virgule (un indice important était le message d'erreur "En fonction‘ Statement ’: ...") et il en est de même de la ligne 24,
return node
(Une fois que vous aurez résolu ces problèmes, vous rencontrerez d'autres problèmes, dont certains sont mentionnés ici.)
Vous semblez inclure un fichier C d'anthère. #include
devrait normalement être utilisé avec les fichiers d'en-tête uniquement.
Dans la définition de struct ast_node
, vous faites référence à struct AST_NODE
, qui n'existe pas. C est sensible à la casse.
Une erreur se produit dans vos déclarations de fonction , regardez la phrase suivante! Vous avez besoin d'un point-virgule
AST_NODE* Statement(AST_NODE* node)
près de la fin de la fonction d'analyse, vous avez manqué un '}'