5

Ho letto le domande correlate, ma nessuna sembra rispondere direttamente alla domanda. Sto lavorando alla scrittura di un interprete di script PHP. Ho l'AST che genera i nodi appropriati per tutto tranne le classi. Gestire le classi è un po 'diverso dalle funzioni di gestione, quindi sto cercando come gestire classi che sono indipendenti e che estendono altre classi.Come rappresentare le classi in un interprete astratto basato su sintassi

Ho esaminato ANTLR, ma non posso permettermi il sovraccarico come questo è per una piattaforma integrata. Quello che sto cercando è la teoria concettualmente dietro le classi in AST in modo che possano essere eseguite dalla porzione esecutore dell'interprete. I buoni collegamenti con le risposte specifiche a questo problema sono sicuramente apprezzati.

risposta

2

ANTLR è più o meno irrilevante per il tuo problema.

Una classe in PHP è fondamentalmente una mappa dalle stringhe agli attributi. Ogni attributo può essere pubblico, privato, protetto. Ogni attributo contiene anche un valore, che potrebbe essere una variabile statica o un metodo. I metodi sono funzioni che (in PHP) prendono un parametro $ implicito. Quindi puoi pensare a una classe come a un oggetto di matrice di fantasia in PHP.

Quando si crea un oggetto, gli si assegna un puntatore al proprio oggetto di classe PHP. Quando si chiama un metodo su quell'oggetto, si ricerca il metodo attraverso l'oggetto classe che si ottiene attraverso quel puntatore.

Spero che questo aiuti.

+0

Giusto, ma questo porta a reinterpretare i token per quell'oggetto ogni volta che la classe viene istanziata correttamente? Immagino che questa sia la differenza tra V8 di Google e altre implementazioni di JavaScript, e che ho bisogno di capirlo. Grazie per le informazioni. –

0

Ho trovato che il metodo migliore in un compilatore top-down, il metodo migliore è quello di trattare le classi in genere proprio come le funzioni, in quanto sono solo nodi senza dover valutare gli argomenti prima di scendere nell'albero.

Le differenze sono nell'esecutore, che deve creare un ambito di esecuzione in cui incapsulare i metodi e le variabili che compongono il nodo di classe.

1

Forse avete bisogno di alcune strutture per l'interpretazione che sono un po 'più rimosse dalla grammatica sorgente? Non so molto di PHP, ma sembra che tu stia davvero chiedendo come strutturare il modello del programma in un modo che sia conveniente per l'interpretazione. Considererei un AST generato via ANTLR un po 'troppo vicino alla fonte per quello che vuoi.

0

Suggerisco di utilizzare JavaCC (o il fork FreeCC) per analizzare e creare il tuo AST. JavaCC genera un parser che non ha dipendenze di runtime. È difficile scrivere un parser più piccolo/più veloce del codice generato da JavaCC.

+0

Cool, guarderò, una cosa che devo osservare è che è compatibile con il bytecode di Dalvik, ho trovato che la maggior parte dei file java .class sono, ma alcuni non sono –

+0

uscite JavaCC solo una coppia di file di classe Java. Questi verrebbero compilati con il tuo normale compilatore. FreeCC ha un miglior supporto per i generici, quindi lo userei sin dalla tua codifica Java 1.5. – brianegge

+0

Grazie per l'aiuto, vedrò se posso usarlo –

0

Dai uno sguardo allo phc abstract grammar, fa esattamente questo. (Per inciso, sembra che usare front-end di phc sia meglio che reinventare la ruota).

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

Grazie Paul, sto ancora utilizzando PHC per i client basati su C/C++, ma come posso usarlo su Android (Java/Dalvik)? –

+0

Suppongo che le app native non siano possibili? Allora forse come servizio web usando l'interfaccia XML? –

Problemi correlati