Article View: pl.comp.lang.c
Article #268084Re: Ciemna strona C++
From: Adam Karpierz
Date: Fri, 14 Dec 2007 02:08
Date: Fri, 14 Dec 2007 02:08
96 lines
6145 bytes
6145 bytes
"Marcin 'Qrczak' Kowalczyk" <qrczak@knm.org.pl> wrote in message news:1197596465.19934.36.camel@qrnik... Dnia 14-12-2007, Pt o godzinie 01:49 +0100, Adam Karpierz pisze: > To jest trochę inne podejście (też dobre): uproszczona analiza > kontekstowa tylko dla potrzeb rozpoznawania typedefów, której wyniki > służą tylko lekserowi. Potem się to robi od nowa z uwzględnieniem > wszystkich konstrukcji. Tak. > Bo można też wykonywać początkowe etapy dalszej analizy równolegle > z lekserem: budować wszelkie informacje o symbolach widocznych w różnych > zakresach. Do dokończenia po parsowaniu, a nie do zrobienia od początku. Dokladnie. > Zgadza sie. Tyle ze niekoniecznie do pokreconej struktury tylko > normalnie w drzewie jako node typedefa > (node typu: typedef z subnode1: nazwa i subnode2: "rozczesanym" typem). > Zupełnie nie o to mi chodziło. Problemem nie jest parsowanie samych > Jeśli mamy coś takiego: > a(*b)(c(d)); > to jeśli a był wprowadzone przez typedef, to jest to deklaracja > wskaźnika b na funkcję zwracającą a, której parametr jest typu c > (nazwa d nie ma tu znaczenia jako nazwa parametru w typie funkcji). > Jeśli jednak a nie jest wprowadzone przez typedef, to jest to aplikacja > funkcji a do wartości odczytanej spod wskaźnika b, gdzie następnie > wynik jest zaaplikowany do aplikacji c do d. To jest zupełnie inne > drzewko, tzn. może i strukturalnie wygląda podobnie, ale węzły mają > zupełnie inną interpretację. Wlasnie o to chodzi ze strukturalnei (synktatycznie) jest identyczne. Mozna sobie wiec przyjac na poczatku dowolne z poddrzew. Natomiast _faktyczna_ "naprawa" drzewa moze sie juz odbyc pozniej droga przechodzenai po calym drzewie i "naprawy" tych wieloznacznych subnodes na wlasciwe (pointer albo call). Wiec czasami stosuje nodes typu CUSalboCUS (slawetny przyklad z konstruktorem klasy czy tez funkcja c C++ ten znany blad z gcc 3.x0 ) > Parsowanie bezkontekstowe ze zunifikowanym drzewkiem > jest co prawda teoretycznie możliwe (o ile nie mamy narzucone, > które aspekty składni musimy rozpoznać już na etapie parsowania, > a które możemy zostawić na potem), ale być może jest całkiem > niepraktyczne. To zalezy. Jesli zalezy nam nie na tym _co_ to znaczy ale jedynie jak wyglada (a mnie w wiekszosci przypadkow o to chodzilo jedynie) to nawet takie "chore" drzewko starczy jesli robimy jedynei cos w rodzaju translatora kodu a wazne dla nas nodes mamy pewnie rozpoznane. > Dlatego twierdzę, że else jest łatwiejsze, bo else można > ujednoznacznić samą zmianą gramatyki, w dodatku całkiem łatwą. Z else oczywicie tak tez robie (wystarczy rozbic na dwie produkcje) Zreszt tak naprawde _co sie tylko_ da wprzegam do gramatyki rozbijajac pierwotne produkcje ale takze przez jakies mneij elegenckie sztuczki typu flagi w nodach itp :) > Język z takim else > jak w C jest wciąż bezkontekstowy - jedyny kłopot jest tej natury, > że najprostsza gramatyka bezkontekstowa jest większa niż najprostsza > gramatyka z niejednoznacznością. Jest większa i zawiera irytujące > prawie-duplikaty, dlatego literatura woli używać tej drugiej gramatyki, > gdzie trzeba uważać na sposób potraktowania niejednoznaczności. Ale w praktyce mnie sprawdza sie zdecydowanie ta pierwsza :) W praktyce _i tak_ rozbijam wiekszosc bezkontekstowych produkcji na kilka bo i tak mi sie sprawdza lepiej gdy mam wieksza odpowioedniosc: produkcja => akcja niz badac w akcji czy aby jakis nody sa None itp i robic jakis chore switche czy ify :) > W C++ równolegle z analizą leksykalną oprócz śledzenia typedefów trzeba > sprawdzać typy, budować hierarchię klas, rozpoznawać miejsca wstawienia > niejawnych konwersji, rozwiązywać przeciążanie funkcji, dedukować > parametry szablonów z typów argumentów funkcji szablonowej, uwzględniać > Koenig lookup, liczyć sizeofy typów, wykonywać arytmetykę na stałych - > połowa kompilatora musi być napisana w taki sposób, żeby można było > wykonywać ją przyrostowo na tym, co właśnie sparsowaliśmy, nie znając > jeszcze pełnego drzewa modułu wychodzącego z parsera. Swieta prawda :) Za leniwy jestem aby skonczyc a takiej dzungli :) Wlasnie ! Z samymi namespaceami wiekszy klopot niz z typedefami a w polaczeniu jedne z drugimi a jeszcze klasy i templates a jeszcze to ze szlag wie czy klass czy struct (pol biedy) czy typedef czy enum czy funkcja :) Nie no dosc :) Parser synktatyczny robi sie niechcacy pelnym kombajnem semantycznym i sie odechciewa zyc :) AK
Technical Details
Message-ID:
<fjsoif$hc0$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgv318$hl7$1@bozon2.softax.pl> <fgv82j$htn$1@news.vectranet.pl> <fjncjm$ov6$1@inews.gazeta.pl> <fjpc4l$6ei$2@news.vectranet.pl> <fjrerb$8su$1@bozon2.softax.pl> <fjri46$h22$1@inews.gazeta.pl> <1197561477.3981.11.camel@qrnik> <fjs9m7$qi$2@news.vectranet.pl> <fjsdb1$eeg$1@inews.gazeta.pl> <1197591962.23942.28.camel@qrnik> <fjsjva$6ba$1@inews.gazeta.pl> <1197596465.19934.36.camel@qrnik>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: "Adam Karpierz" <karpierz@NOOOOSPAAAAMpython.pl> Newsgroups: pl.comp.lang.c Subject: Re: Ciemna strona C++ Date: Fri, 14 Dec 2007 03:08:13 +0100 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 98 Message-ID: <fjsoif$hc0$1@inews.gazeta.pl> References: <fghgeo$spf$1@nemesis.news.tpi.pl> <fghsb4$kpq$1@news.dialog.net.pl> <fgo4c7$mtu$1@news.vectranet.pl> <20071106073039.433f4934@Vorago> <fgqn9m$74j$2@news.vectranet.pl> <618565031.20071107113041@pkierski.net> <fgt6sh$jov$1@news.vectranet.pl> <fgv318$hl7$1@bozon2.softax.pl> <fgv82j$htn$1@news.vectranet.pl> <fjncjm$ov6$1@inews.gazeta.pl> <fjpc4l$6ei$2@news.vectranet.pl> <fjrerb$8su$1@bozon2.softax.pl> <fjri46$h22$1@inews.gazeta.pl> <1197561477.3981.11.camel@qrnik> <fjs9m7$qi$2@news.vectranet.pl> <fjsdb1$eeg$1@inews.gazeta.pl> <1197591962.23942.28.camel@qrnik> <fjsjva$6ba$1@inews.gazeta.pl> <1197596465.19934.36.camel@qrnik> NNTP-Posting-Host: nat-dem.mentorg.com X-Trace: inews.gazeta.pl 1197598095 17792 139.181.124.2 (14 Dec 2007 02:08:15 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Fri, 14 Dec 2007 02:08:15 +0000 (UTC) X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 X-Priority: 3 X-RFC2646: Format=Flowed; Original X-Newsreader: Microsoft Outlook Express 6.00.2900.3138 X-User: karpierz X-MSMail-Priority: Normal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit