Question

J'ai lu des questions connexes, mais aucun d'entre eux semble répondre directement à la question. Je travaille sur l'écriture d'un interpréteur de script PHP. Je l'AST générer des noeuds appropriés pour tout sauf les classes. cours de manutention est un peu différent de fonctions de gestion, donc je cherche comment gérer des classes qui sont autonomes et qui étendent les autres classes.

Je l'ai regardé ANTLR, mais je ne peux pas se permettre les frais généraux car cela est une plate-forme embarquée. Ce que je cherche est la théorie conceptuelle derrière les classes en RSHS afin qu'ils puissent être exécutés par la partie exécuteur testamentaire de l'interprète. De bons liens avec des réponses spécifiques à cette question sont certainement appréciés.

Était-ce utile?

La solution

ANTLR est plus ou moins rien à voir avec votre problème.

Une classe en PHP est essentiellement une carte de chaînes aux attributs. Chaque attribut peut être public, privé, protégé. Chaque attribut détient également une valeur, ce qui pourrait être une variable statique ou une méthode. Les méthodes sont des fonctions (en PHP) prennent un $ ce paramètre implicite. Ainsi, vous pouvez penser à une classe comme essentiellement un objet de tableau de fantaisie en PHP.

Lorsque vous créez un objet, vous lui donnez un pointeur vers votre objet de classe PHP. Lorsque vous appelez une méthode sur cet objet, vous regardez la méthode à travers l'objet de classe que vous obtenez par ce pointeur.

J'espère que cette aide.

Autres conseils

Peut-être vous avez besoin des structures d'interprétation qui sont un peu plus éloignés de la grammaire source? Je ne sais pas grand-chose à propos de PHP, mais il sonne comme vous demandez vraiment comment structurer le modèle de programme d'une manière qui est pratique pour l'interprétation. Je considère un AST généré par ANTLR un peu trop près de la source de ce que vous voulez.

J'ai trouvé que la meilleure méthode en haut vers le bas compilateur, la meilleure méthode consiste à traiter les classes généralement comme des fonctions, en ce sens qu'ils ne sont que des noeuds sans avoir besoin d'évaluer les arguments avant de descendre dans l'arborescence.

Les différences sont à l'exécuteur, qui doit créer un champ d'exécution dans lequel pour encapsuler les méthodes et les variables qui composent le noeud de classe.

Je suggère d'utiliser JavaCC (ou la fourche FreeCC) pour analyser et construire votre AST. JavaCC génère un analyseur qui n'a pas de dépendances d'exécution. Il est difficile d'écrire un analyseur plus petit / plus rapide que le code qui génère JavaCC.

Jetez un oeil à la PHC grammaire abstraite , il fait exactement cela . (Soit dit en passant, il semble que l'utilisation d'extrémité avant de PHC pourrait être mieux que de réinventer la roue).

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"?  ;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top