yacc YYSTYPE feluldefinialasa

 ( Galadh Ereb | 2008. október 20., hétfő - 3:46 )

Udvozletem!

A mai nap botlottam bele egy problemaba, es tobb ora szenvedes utan sem tudom, hogy mi lehetne a megoldas. Roviden annyi, hogy nem sikerul feluldefinialni az YYSTYPE-ot.

Nekem double-re lett volna szuksegem. Eleinte az tunt fel, hogy hiaba van a lex fileban egy yylval=atof(yytext), valamiert mindig 0-t ad vissza. Szepen lassan eljutottam odaig, hogy kiderult az yylval csak 4 bajtos, es int-kent kiirva szepen mukodik.

A yacc fileban termeszetesen ott van a #define YYSTYPE double. Sot, azt is kiprobaltam, hogy az y.tab.c-ben a default int-re beallito reszre beirtam, hogy double, es ugy forditottam, de maradt int.

Olvastam valahol meg olyat, hogy van valami %define, es azzal kellene STYPE-ot allitani, de ez nem sikerult.

Ha valaki tudna segiteni, hogy mi lehet a gond, annak megkoszonnem. Regebben siman mukodott a dolog, bar strukturakkal volt gond, de most valamiert nem, es nem jovok ra az okara.

Ha ez netan segit:
flex 2.5.35
bison (GNU Bison) 2.3
gcc (GCC) 4.3.2

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Hm. Pontosan bemásolnád ide azt a részt, ahogyan az YYSTYPE -ot definiálod? Nekem a dokumentáció azt mondja, hogy define-nal nem lehet, itt mindenféle union-okat/typedef -eket ír. (Közben keresgéltem egy kicsit neten is, és azt látom, hogy az eredeti yacc/byacc (AT&T és BSD) doksikban typedef -eket írnak, míg a bison doksi szimpla #define -t. Hááát.)

Szóval van ez a lehetőség pl:

%union {
	double number;
}

%{

#define YYSTYPE double

%}

%token ...

%%
...
%%

Yacc helyett inkább annak GNU-s változatát (a bisont) szoktuk használni. Egyébként mindkettő elavult, ha teheted használj helyettük Lemont.
--
CCC3

Hello,

elég régen foglalkoztam bison-nal, kb 2 éve. Előkapartam egy kódot, ami asszem' működött:

%{
#include 

#define YYSTYPE unsigned long
#define YYERROR_VERBOSE 1
#define YYDEBUG 1

int yylex(void);
void yyerror(char *);
FILE*   yyin;
unsigned long   linenr = 1;

%}

üdv:

a.

Koszonom szepen a valaszokat, ez a kod relevans resze:


%{
#define YYSTYPE double
...
}%

union-nal koszonom, biztos meg lehet oldani, de most ez nem egy olyan feladat, hogy szukos hataridore meg kell csinalni, tehat workaround helyett inkabb belefektetem az idot es megertem, hogyan kell ezt igazan hasznalni.
Nekem is valami olyan sejtesem van, hogy bison-yacc kompatibilitasi problemarol lehet szo. Elsokent akkor megprobalom elerni, hogy bison-nal es nem yacc-al forditva is menjen a dolog, masreszt megnezem azt a Lemon-t, ha egyszer tenyleg az a jeleneg nem elavult parser generator.

De az tovabbra is rejtely marad szamomra, hogy hogyan lett int az YYSTYPE, ha mar magaban a generalt forrasban is atirtam double-re...
Mindenesetre ha rajovok a dolog nyitjara, majd megirom...

Szerintem a %union a korrekt megoldás, hiszen ahogy a feladat bonyolódik (márpedig ezek a feladatok azt szokták csinálni), előbb vagy utóbb igenis szükség lesz többféle típusra.

Hahó!

Csak egy újabb doksival tudom a projektet támogatni, remélve, hogy segíti a probléma megoldását:

http://epaperpress.com/lexandyacc/index.html

G.
============================================
"Share what you know. Learn what you don't."

No annyit meg hozzatennek, hogy beleneztem a Kernighan-Pike: A UNIX operacios rendszer c. konyvbe, amiben van egy hoc nevu kalkulator, szinten lex/yacc segitsegevel megadva. Mit ad isten, abban is az altalam korabban emlegetett union -os megoldast hasznaljak.

(Valamint a Legradi altal fent emlitett epaperpress oldalon a bibliography reszbol elerhetoen fenn van az *eredeti* lex es yacc doksi szinten pdf-ben, es abban is a union megoldast adjak meg. Szoval tegyel egy kiserletet azzal.)

> workaround helyett inkabb belefektetem az idot es megertem, hogyan kell ezt igazan hasznalni.

Lasd legelso hozzaszolasom :-)

No tovabb bongesztem, es latom am, hogy elvben semmi akadalya a Te #define -os megoldasodnak. (Az elso peldaprogram pont azt hasznalja.) Ebben az esetben mit szolnal egy sima szintaktikai hibahoz/elirashoz? (Ja es probald ki a byacc-ot es a bison-t is, hatha a kicsit mas hibauzenetekbol ra lehetne jonni.)

Szerk: esetleg nem lehet, hogy az yylex-ben van inkabb a gaz? Jo helyen irod at kezzel? Neked - ha jol sejtem az y.tab.h -t kell modositani (nem az y.tab.c-t)