[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: %union errors
From: |
Laurence Finston |
Subject: |
Re: %union errors |
Date: |
Mon, 8 Dec 2008 15:38:31 +0100 (CET) |
On Mon, 8 Dec 2008, Luca wrote:
> Laurence Finston ha scritto:
> > On Fri, 5 Dec 2008, Benny Hardage wrote:
> >
> >
> > > %union
> > > {
> > > int intVal;
> > > bool boolVal;
> > > char* strVal;
> > > std::list<const Variable::Qualifier*>* qList;
> > > Variable* var;
> > > UnaryOperation* uop;
> > > BinaryOperation* binop;
> > > Expression* expr;
> > > DataLiteral* datalit;
> >> }
> > >
> > >
> >
> > I had a problem trying to use types defined in the STL in the `%union'. I
> > don't remember the details, but I believe it involved types where the
> > size isn't known at compile-time not being permitted in unions.
> I think you're wrong. The size of a pointer is always known at compile time,
You're probably right; I didn't register that it was a pointer to a
`list'. I don't know if there are any other issues that might cause this
to fail. Perhaps it was a class I defined myself rather than a class
from the STL; my memory of this is somewhat vague.
Laurence
> std::list<const Variable::Qualifier*>* qList is a pointer and not an object.
> The size is 4 bytes using a 32 bit OS. Bison union is a standard union, you
> can put any type inside. For example, I can compile a union with vector:
>
> %union
> {
> int intVal;
> bool boolVal;
> std::vector<int>* pVectorInt;
> };
>
> You can also insert a pointer to a known class, if you need
>
> class MyClass;
> %union
> {
> int intVal;
> bool boolVal;
> MyClass* pMyClass;
> };
>
> I think the problem concern Variable::Qualifier. This type is known by the
> compiler in y.tab.c (or y.tab.cpp) because the user add the right include file
> (or add some definitions) in the first section (before the first %%) inside .y
> file. The problem arises when your using y.tab.h: here the union is reported
> without the user definitions: for example the previous union uses MyClass but
> it is an undefined symbol
>
> //inside y.tab.h
> typedef union YYSTYPE
> {
> int intVal;
> bool boolVal;
> MyClass* pMyClass; //compiler can complain about MyClass
> type!!!
>
> } YYSTYPE;
>
> so if you include y.tab.h inside a .c or .cpp file where MyClass isn't a
> defined type you'll have an error.
>
>
>
> There is a simple fix, use 3 .h file:
>
> -y.tab.h
> -userdef.h
> -bisondef.h
>
> In userdef.h put all user definition, for example:
> class MyClass;
>
>
> in bisondef.h include put user definitions BEFORE y.tab.h
> #include userdef.h
> #include y.tab.h
>
> then use biosondef.h in place of y.tab.h anywhere in your source code.
> In this way you can also redefine YYLTYPE (user custom locations),
> YYLLOC_DEFAULT (to merge locations) and YY_LOCATION_PRINT (to print locations)
> without any trouble.
> Luca
>
> > I think there was something about constructors as well. I believe this is
> > documented in the section about unions in Stroustrup's _The C++ Programming
> > Language_. At any rate, I couldn't get it to work.
> >
> > My unions for Bison usually contain an `int', a `float', a `char' vector,
> > and
> > a `void*' for everything else. `void*' as `YYSTYPE' would do the trick, but
> > I find it convenient to have semantic values of the other types
> > without having to use casts.
> >
> > Laurence Finston
> >
> > On Fri, 5 Dec 2008, Benny Hardage wrote:
> >
> >
> > > Hello,
> > >
> > > I'm receiving the following errors when I compile:
> > >
> > > In file included from compiler.l:17:
> > > parser.y:27: error: ISO C++ forbids declaration of 'list' with no type
> > > parser.y:27: error: invalid use of '::'
> > > parser.y:27: error: expected ';' before '<' token
> > > parser.y:28: error: ISO C++ forbids declaration of 'Variable' with no type
> > > parser.y:28: error: expected ';' before '*' token
> > > parser.y:29: error: ISO C++ forbids declaration of 'UnaryOperation' with
> > > no type
> > > parser.y:29: error: expected ';' before '*' token
> > > parser.y:30: error: ISO C++ forbids declaration of 'BinaryOperation'
> > > with no type
> > > parser.y:30: error: expected ';' before '*' token
> > > parser.y:31: error: ISO C++ forbids declaration of 'Expression' with no
> > > type
> > > parser.y:31: error: expected ';' before '*' token
> > > parser.y:32: error: ISO C++ forbids declaration of 'DataLiteral' with no
> > > type
> > > parser.y:32: error: expected ';' before '*' token
> > >
> > > I've seen a fairly old thread that attempted to address this issue,
> > > saying that my include files might not be in the right order, but the
> > > top of my file looks like the following:
> > >
> > > %error-verbose
> > >
> > > %{
> > >
> > > int yylex();
> > >
> > > #include <iostream>
> > > #include "expressions.hpp"
> > > #include "statements.hpp"
> > >
> > > extern bool outputTokens;
> > > extern bool outputParser;
> > >
> > > void yyerror( char* msg )
> > > {
> > > std::cerr << msg << std::endl;
> >> }
> > >
> > > %}
> > >
> > > %union
> > > {
> > > int intVal;
> > > bool boolVal;
> > > char* strVal;
> > > std::list<const Variable::Qualifier*>* qList;
> > > Variable* var;
> > > UnaryOperation* uop;
> > > BinaryOperation* binop;
> > > Expression* expr;
> > > DataLiteral* datalit;
> >> }
> > >
> > > expressions.hpp contains the datatypes in question.
> > >
> > > I was wondering if someone might let me know what I was doing wrong.
> > >
> > > Thanks,
> > > B.J.
> > >
> > >
> >> _______________________________________________
> > > address@hidden http://lists.gnu.org/mailman/listinfo/help-bison
> > >
> > >
> >
> >
> > _______________________________________________
> > address@hidden http://lists.gnu.org/mailman/listinfo/help-bison
> >
> >
>
> _______________________________________________
> address@hidden http://lists.gnu.org/mailman/listinfo/help-bison
>
>