Domanda

Ho letto le questioni connesse, ma nessuno di loro sembra affrontare direttamente la questione. Sto lavorando sulla scrittura di un interprete di script PHP. Ho l'AST generare nodi adeguate per tutto tranne le classi. Gestione classi è un po 'diverso rispetto a funzioni di gestione, quindi non vedo per come gestire classi che sono standalone, e che si estendono altre classi.

Ho guardato ANTLR, ma non posso permettermi le spese generali come questo è per una piattaforma embedded. Quello che sto cercando è la teoria dietro concettualmente classi in AST in modo che possano essere effettuate direttamente dalla porzione esecutore dell'interprete. Buoni collegamenti con risposte specifiche a questo problema sono sicuramente apprezzati.

È stato utile?

Soluzione

ANTLR è più o meno irrilevanti per il vostro problema.

Una classe in PHP è fondamentalmente una mappa da stringhe 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) assumono un $ implicita questo parametro. Così si può pensare a una classe come fondamentalmente un oggetto array di fantasia in PHP.

Quando si crea un oggetto, si dà un puntatore all'oggetto classe PHP. Quando si chiama un metodo su tale oggetto, si guarda il metodo attraverso l'oggetto di classe, che si ottiene attraverso tale puntatore.

Spero che questo aiuta.

Altri suggerimenti

Forse avete bisogno di alcune strutture per l'interpretazione che sono un po 'più lontano dalla grammatica fonte? Non so molto di PHP, ma il suono come si sta davvero chiedendo come strutturare il modello del programma in un modo che è conveniente per l'interpretazione. Mi piacerebbe considero un AST generato tramite ANTLR come un po 'troppo vicino alla fonte per ciò che si vuole.

Ho trovato che il metodo migliore in un compilatore dall'alto verso il basso, il metodo migliore è quello di trattare le classi in generale, proprio come le funzioni, in quanto sono solo nodi senza la necessità di valutare gli argomenti prima di scendere nella struttura.

Le differenze riguardano l'esecutore, che deve creare un ambito di esecuzione in cui per incapsulare i metodi e le variabili che costituiscono il nodo classe.

Io suggerirei usando JavaCC (o la forcella FreeCC) per analizzare e costruire il vostro AST. JavaCC genera un parser che non ha dipendenze runtime. E 'difficile scrivere un parser più piccolo / più veloce rispetto al codice che genera JavaCC.

Date un'occhiata alla phc grammatica astratta , lo fa esattamente questo . (Per inciso, suona come l'utilizzo di front-end di PHC potrebbe essere migliore di 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"?  ;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top