«« ( Date ) »» // «« ( Thread ) »» // ri4pp - 2005

Re: C / C++ problem

by Dejan Milosevic
petak, 29. april 2005 - 15:55.

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.