[Webinar] Streamline your web hosting managementRegister Today

x
?
Solved

$1 - has no declared type

Posted on 2009-04-03
9
Medium Priority
?
2,042 Views
Last Modified: 2012-05-06
Hello,

I try to declare a rule in my yacc but i get the following error :
 $1 of `goal' has no declared type

Thanks in advance for any help !
0
Comment
Question by:unknown_
  • 4
  • 4
9 Comments
 

Author Comment

by:unknown_
ID: 24065070

%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
	
#define YYDEBUG 1
 
extern int  yyparse();
 extern int yylex();
 extern int line  ;
 
 
extern FILE *yyin;	
 
int yywrap()
 {
    return 1;
 }
   
void yyerror( const char *msg )
{
  printf("Line %d: %s\n",line, msg); 
}
 
 
 
 
 
enum treetype {operator_node, number_node, variable_node};
 typedef struct tree {
   enum treetype nodetype;
   union {
     struct {struct tree *left, *right; char operator;} an_operator;
     int ival;
     char sval;
   } body;
 } tree;
 static tree *make_operator (tree *l, char o, tree *r) {
   tree *result= (tree*) malloc (sizeof(tree));
   result->nodetype= operator_node;
   result->body.an_operator.left= l;
   result->body.an_operator.operator= o;
   result->body.an_operator.right= r;
   return result;
 }
 static tree *make_number (int n) {
   tree *result= (tree*) malloc (sizeof(tree));
   result->nodetype= number_node;
   result->body.ival= n;
   return result;
 }
 static tree *make_variable (char v) {
   tree *result= (tree*) malloc (sizeof(tree));
   result->nodetype= variable_node;
   result->body.sval= v;
   return result;
 }
 static void printtree (tree *t, int level) {
 #define step 4
   if (t)
     switch (t->nodetype)
     {
       case operator_node:
        printtree (t->body.an_operator.right, level+step);
        printf ("%*c%c\n", level, ' ', t->body.an_operator.operator);
        printtree (t->body.an_operator.left, level+step);
        break;
       case number_node:
        printf ("%*c%d\n", level, ' ', t->body.ival);
        break;
       case variable_node:
        printf ("%*c%c\n", level, ' ', t->body.sval);
     }
 }
 
 
 
 
 
%}
 
%start goal
 
%union {
	int ival;
	char * sval;
  tree * btree;
}
 
%token <sval> IDENTIFIER
%token <sval> VARIABLE
%token <ival> INTEGER
 /*%token <ival> FLOAT*/
%token <sval> STRING
%token <sval> LITERAL
%token <sval> UNKNOWN 
%token <sval> PLUS
%token <sval> MINUS
%token <sval> TIMES
%token <sval> SLASH
%token <sval> LPAREN
%token <sval> RPAREN
%token <sval> SEMICOLON
%token <sval> COMMA
%token <sval> EQL
%token <sval> OR 
%token <sval> ORR
%token <sval> AND
%token <sval> ANDD
 
 
/* keywords */
%token <sval> IF
%token <sval> ELSE
%token <sval> DO
%token <sval> INT
%token <sval> RETURN
%token <sval> VOID
%token <sval> FLOAT
%token <sval> WHILE
 
%type <btree> goal
%type <ival> expression
%type <ival> term 
%type <ival> factor 
%type <sval> ifstatement
%type <sval> whilestatement
%type <sval> dostatement
%type <sval> variable_list
%type <sval> variable 
 
 
 
%%
 
goal	: statement_list SEMICOLON  {printtree ($1, 1);}
        ;
 
statement_list: { /*empty*/ }
                | statement_list statement
		;
 
statement : declaration_statement
          | ifstatement 
          | whilestatement
          | variable '=' expression SEMICOLON 
          | dostatement 
          |returnstatement 
          ;
 
declaration_statement : INT variable_list SEMICOLON {printf("INT_VARIABLE\n");}
                      | FLOAT variable_list SEMICOLON {printf("FLOAT_VARIABLE\n");}
                      ;
 
 
 
expression		:	term '+' term {printf("ADDITION\n");} {$$ = make_operator($1, '+', $3);}
|	term '-' term {printf("SUBTRACTION\n");} {$$ = make_operator ($1, '-' ,$3);}
|	term {printf("\n");}  {$$ = $1;}   ;
 
 
 
 
term			:	factor '*' factor  {printf("MULTIPLICATION\n");} {$$ = make_operator($1,'*', $3);}
|	factor '/' factor  {printf("DIVISION\n");} {$$ = make_operator($1, '/', $3);} 
|	factor {printf("\n");}  {$$ = $1;}  ;
 
 
factor			:	variable {printf("rule 7\n");} 
|	INTEGER {printf("integer\n");} {$$ = make_number($1);} 
|	FLOAT {printf("float\n");}  {$$ = make_number($1);}
|	STRING {printf("string\n");}  {$$ = make_variable($1);}
|	'(' expression ')' {$$ = $2;} ;
 
ifstatement		:	IF '(' expression ')' goal ELSE goal SEMICOLON {printf("rule: IF_ELSE_STATEMENT\n");}
|	IF '(' expression ')' goal {printf("rule: IF_STATEMENT\n");};
 
whilestatement	:	WHILE '(' expression ')' goal {printf("rule: WHILE_STATEMENT\n");};
	
		
dostatement : DO '(' expression ')' WHILE '(' expression ')' SEMICOLON   {printf("rule DO_STATEMENT\n");} ;
 
returnstatement : RETURN { } SEMICOLON   {printf("rule RETURN_STATEMENT\n");} ;
| RETURN factor SEMICOLON {printf("rule : RETURN 2\n");} 
;
 
 
variable : VARIABLE {printf("rule: variable2\n");} {$$= make_variable($1); };
 
	
variable_list : variable {printf("rule : variable1\n");}  {$$= make_variable($1); }
|  variable_list ',' variable {printf("rule: multvar\n");} {$$ = make_variable($1);} //	variable ',' variable_list {printf("rule: var,var\n");}  ;
;
 
%%
 
#include "lex.yy.c"
 
main(int argc,char *argv[])
{
 if(argc<1)
   {
    printf("Please specify the input file\n");
    exit(0);
   }
 FILE *fp=fopen(argv[1],"r");
 if(!fp)
   {
     printf("couldn't open file for reading\n");
     exit(0);
   }
 yyin=fp;
 
 do {
   yyparse();
 }while (!feof(yyin));
 
 fclose(fp);
}
 
 

Open in new window

0
 
LVL 40

Accepted Solution

by:
mrjoltcola earned 1500 total points
ID: 24065095
Look at the rule for "goal" and tell me what $1 represents. That should give you the answer to what you need to do.


0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24065135
Have you considered the book "Lex & Yacc" by John Levine? I have a hardcopy of it, I recommend it. You can spend 2 days reading it and answer a lot of your questions. Or read it online, parts of it are available at least.

http://books.google.com/books?id=YrzpxNYegEkC&dq=lex+and+yacc&printsec=frontcover&source=bn&hl=en&ei=tZnWSdP4MZqstgeWqLzhDw&sa=X&oi=book_result&ct=result&resnum=4#PPA27,M1
0
The new generation of project management tools

With monday.com’s project management tool, you can see what everyone on your team is working in a single glance. Its intuitive dashboards are customizable, so you can create systems that work for you.

 

Author Comment

by:unknown_
ID: 24065138
$1 represents statement_list

I still can't understand why its wrong
0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24065176
So how do you declare what type statement_list is to yacc? The same way as the rest of the tokens and rules.
0
 
LVL 40

Expert Comment

by:mrjoltcola
ID: 24065185
The error is telling you exactly what is wrong. I don't see any type declaration for statement_list, do you?
0
 

Author Comment

by:unknown_
ID: 24065237
ok , you're right there is no type declaration for statement_list
but the point is how can i call printtree otherwise ?  

0
 
LVL 53

Expert Comment

by:Infinity08
ID: 24089417
How about doing that in the main for example ?
0
 

Author Closing Comment

by:unknown_
ID: 31566486
Can you please explain me how can i create a printout of my parse tree ?

Thanks in advance!

0

Featured Post

Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
The goal of this video is to provide viewers with basic examples to understand and use structures in the C programming language.
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
Suggested Courses

591 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question