Solved

$1 - has no declared type

Posted on 2009-04-03
9
1,614 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 500 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
 

Author Comment

by:unknown_
ID: 24065138
$1 represents statement_list

I still can't understand why its wrong
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

This tutorial is posted by Aaron Wojnowski, administrator at SDKExpert.net.  To view more iPhone tutorials, visit www.sdkexpert.net. This is a very simple tutorial on finding the user's current location easily. In this tutorial, you will learn ho…
Summary: This tutorial covers some basics of pointer, pointer arithmetic and function pointer. What is a pointer: A pointer is a variable which holds an address. This address might be address of another variable/address of devices/address of fu…
The goal of this video is to provide viewers with basic examples to understand opening and writing to files in the C programming language.
The goal of this video is to provide viewers with basic examples to understand and use conditional statements in the C programming language.

863 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

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now