5

Znam związane z nimi pytania, ale żaden z nich nie wydaje się bezpośrednio odpowiadać na to pytanie. Pracuję nad pisaniem interpretera skryptów PHP. Mam AST generujące właściwe węzły dla wszystkiego poza klasami. Obsługa klas jest nieco inna niż obsługa funkcji, więc szukam sposobu obsługi klas, które są autonomiczne i które rozszerzają inne klasy.Jak reprezentować klasy w interpretatorze opartym na drzewku składni abstrakcyjnej

Spojrzałem na ANTLR, ale nie stać mnie na narzut, tak jak ma to miejsce w przypadku platformy wbudowanej. To, czego szukam, to teoria teoretycznie stojąca za klasami w AST, aby mogły być wykonywane przez część testera tłumacza. Dobre linki do konkretnych odpowiedzi na ten temat są zdecydowanie doceniane.

Odpowiedz

2

ANTLR jest mniej lub bardziej nieistotny dla twojego problemu.

Klasa w PHP to w zasadzie mapa od łańcuchów do atrybutów. Każdy atrybut może być publiczny, prywatny, chroniony. Każdy atrybut ma również wartość, która może być zmienną statyczną lub metodą. Metody są funkcjami, które (w PHP) przyjmują niejawny $ ten parametr. Więc możesz myśleć o klasie jako w zasadzie fantazyjnym obiekcie tablicy w PHP.

Po utworzeniu obiektu podajemy wskaźnik do obiektu klasy PHP. Kiedy wywołujesz metodę na tym obiekcie, sprawdzasz metodę przez obiekt klasy, który dostajesz przez ten wskaźnik.

Mam nadzieję, że to pomoże.

+0

Dobrze, ale to prowadzi do ponownego interpretowania tokenów dla tego obiektu za każdym razem, gdy klasa jest tworzona prawidłowo? Domyślam się, że jest to różnica między wersją V8 firmy Google a innymi implementacjami JavaScript i muszę to zrozumieć. Dzięki za informację. –

0

Odkryłem, że najlepsza metoda w kompilatorze od góry do dołu, najlepszą metodą jest traktowanie klas tak jak funkcji, ponieważ są one po prostu węzłami bez potrzeby oceny argumentów przed zejściem do drzewa.

Różnice występują w executorze, który musi utworzyć zakres wykonywania, w którym będą enkapsulowane metody i zmienne, które składają się na węzeł klasy.

1

Być może potrzebujesz trochę struktur do interpretacji, które są nieco bardziej usunięte z gramatyki źródłowej? Nie wiem zbyt wiele o PHP, ale brzmi to tak, jakbyś naprawdę pytał o strukturę modelu programu w sposób wygodny do interpretacji. Uważałbym, że AST generowany przez ANTLR jest zbyt blisko źródła dla tego, co chcesz.

0

Proponuję użyć JavaCC (lub rozwidlenia FreeCC) do analizy i budowy AST. JavaCC generuje analizator składni, który nie ma zależności środowiska wykonawczego. Trudno jest napisać mniejszy/szybszy analizator składni niż kod generowany przez JavaCC.

+0

Fajnie, przyjrzę się temu, jedną rzeczą, którą muszę obejrzeć jest to, że jest kompatybilny z bajtowym kodeksem Dalkika, odkryłem, że większość plików Java .class jest, ale niektóre nie są –

+0

JavaCC wyprowadza tylko parę plików klas Java. Zostaną one skompilowane za pomocą zwykłego kompilatora. FreeCC ma lepsze wsparcie dla generycznych, więc używałbym tego od twojego kodowania Java 1.5. – brianegge

+0

Dzięki za pomoc, zobaczę, czy mogę go używać. –

0

Spójrz na phc abstract grammar, robi dokładnie to. (Nawiasem mówiąc, wygląda na to, że używanie front-endu phc może być lepsze niż wymyślanie koła na nowo).

Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME? implements:INTERFACE_NAME* Member* ; 
Class_mod ::= "abstract"? "final"? ; 

Interface_def ::= INTERFACE_NAME extends:INTERFACE_NAME* Member* ; 

Member ::= Method | Attribute ; 

Method ::= Signature Statement*? ; 
Signature ::= Method_mod is_ref:"&"? METHOD_NAME Formal_parameter* ; 
Method_mod ::= "public"? "protected"? "private"? "static"? "abstract"? "final"? ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Formal_parameter ::= Type is_ref:"&"? var:Name_with_default ; 
Type ::= CLASS_NAME? ; 
Name_with_default ::= VARIABLE_NAME Expr? ; 

Attribute ::= Attr_mod vars:Name_with_default* ; 
Attr_mod ::= "public"? "protected"? "private"? "static"? "const"? ; 
+0

Dzięki Paul, wciąż szukam możliwości korzystania z PHC dla klientów opartych na C/C++, ale jak mogę go używać na Androidzie (Java/Dalvik)? –

+0

Założę się, że aplikacje natywne nie są możliwe? A może jako usługa internetowa korzystająca z interfejsu XML? –

Powiązane problemy