Re: C / C++ problem
Konacan odgovor (ovo mi se cini kao najjednostavnije moguce resenje):
0) pre svega rename lex.yy.c lex.yy.cpp! Mora jer jedino tako yacc nalazi yylex() (ali NE treba praviti c++ lexer sa "-+" opcijom jer on pravi neku lexer... klasu u kojoj je yylex() metoda koju yacc opet tesko moze da nadje (uz mnogo izmena)). Drugi nacin je to sto prof. kaze "force c++ code" bez obzira na extenziju ali ja tu opciju u MSVC++ 6.0 nisam nasao (znam gde je u Turbo C++ 3.0 (DOS) ali....)
1) napravi / izmeni yacc fajl "domaci.y"
2) pokreni "yacc domaci.y" => dobija se y.tab.c
3) rename y.tab.c y.tab.cpp (ovo mora jer u njemu stoji include "tab.h" u kome su klase za tabelu simbola)
4) dodati extern ispred "YYSTYPE yylval" u lex.yy.cpp (obavezno tu jer yacc SAM definise "YYSTYPE yylval" u sred svog generisanog fajla ali bez "extern" pa iako stavimo extern u domaci.y bice duple definicije (u lex.yy.cpp i u y.tab.cpp)). yylval nam treba za DZ3 i u lexu i u yacc-u (mnogi je verovatno nisu koristili u DZ2).
u fajlu y.tab.cpp "replace y.tab.c with y.tab.cpp" ne treba raditi, #line direktive sluze samo za prijavljivanje gresaka prevodioca (sa #line xxx fajl.fff mozemo da ga zajebemo da misli da je greska u fajl.fff u xxx liniji umesto tamo gde stvarno jeste, ali to nema nikakav uticaj na prevodjenje, vec samo na izvestaj o prevodjenju)
Pitanje za prof. (ako zna) gde je opcija "force c++ code" u Microsoft Visual C++ 6.0.
----- Original Message -----
From: Milos Stoiljkovic
To: ri4pp@titan.etf.bg.ac.yu
Sent: Friday, January 07, 2005 12:51 AM
Subject: Re: [ri4pp] C / C++ problem
Evo kako sam ja radio (koristim MSVC++):
u editoru visual studia pravim yacc fajl i snimim. onda u komandni prozor gde pokrenem bat fajl koji :
1) pokrene yacc koji generise y.tab.c
2) izbrise y.tab.cpp (ako ga ima)
3) preimenuje y.tab.c u y.tab.cpp
Onda se vratim u VC, gde mi iskoci message box koji kaze da se y.tab.cpp promenio i pita da li da ponovo ucitam, ja kazem Yes i dobijem novi y.tab.cpp. Onda CTRL+H i uradim u fajlu y.tab.cpp "replace y.tab.c with y.tab.cpp". To je potrebno zbog onih #line direktiva u y.tab.cpp fajlu koje sve ukazuju na y.tab.c, koji ne postoji.
Nakon svega toga pokrenem kompajler.Ako ima nekih gresaka, onda sve iz pocetka.
Komplikovano? Vrlo, ali tako sam uspeo da uradim, a ako ima prostiji nacin, sada mi to nista ne vredi.
U stvari je problem u tome sto mi moramo da koristimo klase posto je tabela simbola implementirana kao objektno-orijentisana. Onda mesamo C++ kod u generisani y.tab.c. Vecina nas koristi MSVC koji fajlove sa ekstenzijom *.c prevodi kao cist C (bar je tako u VC5 koji ja koristim) a ne C++. Da bi mogli da koristimo tabelu simbola taj fajl mora da ima ekstenziju *.cpp, sto onda stvara probleme druge prirode koje sam vec objasnio.
0) pre svega rename lex.yy.c lex.yy.cpp! Mora jer jedino tako yacc nalazi yylex() (ali NE treba praviti c++ lexer sa "-+" opcijom jer on pravi neku lexer... klasu u kojoj je yylex() metoda koju yacc opet tesko moze da nadje (uz mnogo izmena)). Drugi nacin je to sto prof. kaze "force c++ code" bez obzira na extenziju ali ja tu opciju u MSVC++ 6.0 nisam nasao (znam gde je u Turbo C++ 3.0 (DOS) ali....)
1) napravi / izmeni yacc fajl "domaci.y"
2) pokreni "yacc domaci.y" => dobija se y.tab.c
3) rename y.tab.c y.tab.cpp (ovo mora jer u njemu stoji include "tab.h" u kome su klase za tabelu simbola)
4) dodati extern ispred "YYSTYPE yylval" u lex.yy.cpp (obavezno tu jer yacc SAM definise "YYSTYPE yylval" u sred svog generisanog fajla ali bez "extern" pa iako stavimo extern u domaci.y bice duple definicije (u lex.yy.cpp i u y.tab.cpp)). yylval nam treba za DZ3 i u lexu i u yacc-u (mnogi je verovatno nisu koristili u DZ2).
u fajlu y.tab.cpp "replace y.tab.c with y.tab.cpp" ne treba raditi, #line direktive sluze samo za prijavljivanje gresaka prevodioca (sa #line xxx fajl.fff mozemo da ga zajebemo da misli da je greska u fajl.fff u xxx liniji umesto tamo gde stvarno jeste, ali to nema nikakav uticaj na prevodjenje, vec samo na izvestaj o prevodjenju)
Pitanje za prof. (ako zna) gde je opcija "force c++ code" u Microsoft Visual C++ 6.0.
----- Original Message -----
From: Milos Stoiljkovic
To: ri4pp@titan.etf.bg.ac.yu
Sent: Friday, January 07, 2005 12:51 AM
Subject: Re: [ri4pp] C / C++ problem
Evo kako sam ja radio (koristim MSVC++):
u editoru visual studia pravim yacc fajl i snimim. onda u komandni prozor gde pokrenem bat fajl koji :
1) pokrene yacc koji generise y.tab.c
2) izbrise y.tab.cpp (ako ga ima)
3) preimenuje y.tab.c u y.tab.cpp
Onda se vratim u VC, gde mi iskoci message box koji kaze da se y.tab.cpp promenio i pita da li da ponovo ucitam, ja kazem Yes i dobijem novi y.tab.cpp. Onda CTRL+H i uradim u fajlu y.tab.cpp "replace y.tab.c with y.tab.cpp". To je potrebno zbog onih #line direktiva u y.tab.cpp fajlu koje sve ukazuju na y.tab.c, koji ne postoji.
Nakon svega toga pokrenem kompajler.Ako ima nekih gresaka, onda sve iz pocetka.
Komplikovano? Vrlo, ali tako sam uspeo da uradim, a ako ima prostiji nacin, sada mi to nista ne vredi.
U stvari je problem u tome sto mi moramo da koristimo klase posto je tabela simbola implementirana kao objektno-orijentisana. Onda mesamo C++ kod u generisani y.tab.c. Vecina nas koristi MSVC koji fajlove sa ekstenzijom *.c prevodi kao cist C (bar je tako u VC5 koji ja koristim) a ne C++. Da bi mogli da koristimo tabelu simbola taj fajl mora da ima ekstenziju *.cpp, sto onda stvara probleme druge prirode koje sam vec objasnio.
- Follow-Ups:
- level = ?
- From: "Dejan Milosevic" <dezy@infosky.net>
- Re: C / C++ problem
- From: Dragan Bojic <bojic@etf.bg.ac.yu>
- level = ?
- References:
- C / C++ problem
- From: "Dejan Milosevic" <dezy@infosky.net>
- Re: C / C++ problem
- From: "Milos Stoiljkovic" <mikee@isp.b92.net>
- C / C++ problem
Previous by date: Re: {za profesora} drugi deo ispita
Next by date: Re: C / C++ problem
Previous by thread: Re: C / C++ problem Next by thread: Re: C / C++ problem
Previous by thread: Re: C / C++ problem Next by thread: Re: C / C++ problem