Solved

$1 - has no declared type

Posted on 2009-04-03
9
1,581 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
What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

 
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

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

This article describes a simple method to resize a control at runtime.  It includes ready-to-use source code and a complete sample demonstration application.  We'll also talk about C# Extension Methods. Introduction In one of my applicationsā€¦
Introduction Hi all and welcome to my first article on Experts Exchange. A while ago, someone asked me if i could do some tutorials on object oriented programming. I decided to do them on C#. Now you may ask me, why's that? Well, one of the reā€¦
Video by: Grant
The goal of this video is to provide viewers with basic examples to understand and use nested-loops in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

707 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

12 Experts available now in Live!

Get 1:1 Help Now