5

He leído las preguntas relacionadas, pero ninguna de ellas parece abordar la pregunta directamente. Estoy trabajando en escribir un intérprete de guiones PHP. Tengo AST generando nodos adecuados para todo, excepto las clases. Manejar clases es un poco diferente que manejar funciones, entonces estoy buscando cómo manejar clases que son independientes, y que extienden otras clases.Cómo representar clases en un intérprete basado en árbol de sintaxis abstracta

He mirado ANTLR, pero no puedo pagar los gastos generales ya que esto es para una plataforma integrada. Lo que estoy buscando es la teoría conceptual detrás de las clases en los AST para que puedan ser ejecutados por la parte ejecutora del intérprete. Los buenos enlaces con respuestas específicas a este problema son definitivamente apreciados.

Respuesta

2

ANTLR es más o menos irrelevante para su problema.

Una clase en PHP es básicamente un mapa de cadenas de atributos. Cada atributo puede ser público, privado, protegido. Cada atributo también contiene un valor, que podría ser una variable estática o un método. Los métodos son funciones que (en PHP) toman un $ implícito de este parámetro. Entonces, puede pensar en una clase básicamente como un objeto de matriz elegante en PHP.

Cuando crea un objeto, le da un puntero a su objeto de clase PHP. Cuando llama a un método en ese objeto, busca el método a través del objeto de clase que obtiene a través de ese puntero.

Espero que esto ayude.

+0

derecho, pero eso lleva a re-interpretar las fichas de ese objeto cada vez que se crea una instancia de la clase correcta? Supongo que esa es la diferencia entre el V8 de Google y otras implementaciones de JavaScript, y que necesito resolverlo. Gracias por la info. –

0

He encontrado que el mejor método en un compilador de arriba hacia abajo, el mejor método es tratar las clases generalmente como funciones, en el sentido de que son solo nodos sin necesidad de evaluar los argumentos antes de descender al árbol.

Las diferencias están en el ejecutor, que tiene que crear un ámbito de ejecución en el que encapsular los métodos y variables que componen el nodo de clase.

1

Quizás necesite algunas estructuras de interpretación que están un poco más alejadas de la gramática de origen? No sé mucho sobre PHP, pero suena como si realmente estuvieras preguntando cómo estructurar el modelo de programa de una manera conveniente para la interpretación. Consideraría que un AST generado a través de ANTLR está demasiado cerca de la fuente como para que usted lo desee.

0

Sugeriría usar JavaCC (o el tenedor FreeCC) para analizar y construir su AST. JavaCC genera un analizador que no tiene dependencias de tiempo de ejecución. Es difícil escribir un analizador más pequeño/más rápido que el código que genera JavaCC.

+0

Genial, voy a echarle un vistazo, una cosa que tengo que ver es que es compatible con bytecode de Dalvik, he encontrado que la mayoría de los archivos .class de Java son, pero algunos no son –

+0

salidas de JavaCC solo un par de los archivos de clase de Java. Estos se compilan con tu compilador habitual. FreeCC tiene un mejor soporte para genéricos, así que lo usaría desde su codificación Java 1.5. – brianegge

+0

Gracias por la ayuda, voy a ver si puedo usarlo –

0

Eche un vistazo a phc abstract grammar, hace exactamente eso. (Por cierto, parece que usar front-end de phc podría ser mejor que reinventar la rueda).

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

Gracias Paul, todavía estoy buscando usar PHC para clientes basados ​​en C/C++, pero ¿cómo puedo usarlo en Android (Java/Dalvik)? –

+0

¿Asumo que las aplicaciones nativas no son posibles? Entonces, ¿tal vez como servicio web utilizando la interfaz XML? –

Cuestiones relacionadas