I am working on a project that parses a text file thats suppose to be a simple coded program. The problem is that when I try to complile the program I get this 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
Im not familiar with this error and not sure how to fix it.
Here is my parser.c file which the error is happening in:
#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;
}
Here is my driver.c file where I am also getting the error "old-style parameter declarations in prototyped function definition expected '{' at end of input". This also I am very unfamiliar with.
#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;
}
Here is my parser.h file where I declare my TOKEN and my AST_NODE to create my tree and form my tokens to fill the tree.
#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
There is one more file called scanner.c but I know its working perfectly because I have tested it in all the possible inputs and got no problems.
If anyone could help I would appreciate it very much.
AST_NODE* Statement(AST_NODE* node)
is missing a semicolon (a major clue was the error message "In function ‘Statement’: ...") and so is line 24,
return node
(Once you fix those, you will encounter other problems, some of which are mentioned by others here.)
You seem to be including one C file from anther. #include
should normally be used with header files only.
Within the definition of struct ast_node
you refer to struct AST_NODE
, which doesn't exist. C is case-sensitive.
I encountered the same problem in the code and What I did is I found out all the changes I have made from the last correct compilation. And I have observed one function declaration was without ";" and also it was passing a value and I have declared it to pass nothing "void". this method will surely solve the problem for many.
Viscon
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With