.oisyn schreef op 23 december 2002 @ 12:46:
Ik weet wat multipass op zich inhoudt, maar het punt is dat er meerder interpretaties van zijn. Vroeger was multipass namelijk dat de source echt 2x wordt gescanned/geparsed, denk aan de oude assemblers. Tegenwoordig is dat helemaal niet meer het geval, waardoor het dus nogal vaag wordt of iets single of multipass gebeurt
Ik zou zelf ook niet zo vast houden aan 2 keer. Waar ik voornamelijk op doel is dat je een AST opbouwt, en daar later meerdere keren over heen gaat, en dan kan je dit soort problemen zeer eenvoudig oplossen
class A{
B b;
}
class B{
A a;
}
Ipv dat je met allerlei onnodige forward declaraties moet komen. Dit komt over het algemeen de leesbaarheid ten goeie. En ik vind het persoonlijk ook wel zo handig werken omdat je niet bezig hoeft te houden met allerlei tekortkomingen in de parser die al lang verholpen hadden kunnen worden (tenslotte zijn die technieken tot in den treure beschreven).
Java bijvoorbeeld, waar Alarmnummer ongetwijfeld op doelt met z'n 'geavanceerdere talen',
Niet alleen Java hoor, maar ik heb het zelf ook meerdere keren toegepast en het is zeer eenvoudig (als je een beetje een goeie AST hebt).
is in principe ook wel in singlepass te parsen. Maar daar is het probleem ook vrij simpel, de enige typen die je zelf kunt definieren zijn classes (en dan reken ik interfaces ook even tot de classes).

Een 2e pass over de AST is dus totaal niet nodig, je kunt simpelweg voldoen met eerst verzamelen van de class definities en dan elke class definitie apart gaan analyseren. Je doorloopt de boom dan in 1 pass, zij het in een andere volgorde
Zie mijn voorbeeld. Een andere volgorde die classes parsen heeft ook geen nut, omdat het probleem symetrisch is.
En is C++ bijvoorbeeld multipass? Daar kun je in principe 2 antwoorden op geven. Ten eerste zou je zeggen: nee, aangezien de types van tevoren bekend moeten zijn
Ten tweede kun je zeggen: ja, je kunt in een class definitie gebruik maken van een member function/variable terwijl die pas verderop gedefinieerd wordt
Dus wat is het nou?

Ik ben niet echt thuis in c++ of de parsetechnieken die daarvoor gebruikt zijn.
[
Voor 8% gewijzigd door
Alarmnummer op 23-12-2002 13:33
]