Как представить классы в интерпретаторе абстрактного синтаксического дерева - PullRequest
5 голосов
/ 27 мая 2009

Я прочитал соответствующие вопросы, но ни один из них, кажется, не касается вопроса напрямую. Я работаю над написанием интерпретатора сценариев PHP. У меня есть AST, генерирующий правильные узлы для всего, кроме классов. Обработка классов немного отличается от обработки функций, поэтому я ищу способы обработки классов, которые являются автономными и расширяют другие классы.

Я посмотрел на ANTLR, но я не могу позволить себе накладные расходы, поскольку это для встроенной платформы. То, что я ищу, - это теория концептуально стоящих за классами в AST, чтобы они могли выполняться исполнителем интерпретатора. Хорошие ссылки с конкретными ответами на этот вопрос, безусловно, приветствуются.

Ответы [ 5 ]

2 голосов
/ 29 мая 2009

ANTLR более или менее не имеет отношения к вашей проблеме.

Класс в PHP - это, в основном, карта из строк в атрибуты. Каждый атрибут может быть публичным, частным, защищенным. Каждый атрибут также содержит значение, которое может быть статической переменной или методом. Методы - это функции, которые (в PHP) принимают неявный $ this параметр. Таким образом, вы можете думать о классе как об основном объекте массива в PHP.

Когда вы создаете объект, вы указываете ему указатель на ваш объект класса PHP. Когда вы вызываете метод для этого объекта, вы просматриваете метод через объект класса, который вы получаете через этот указатель.

Надеюсь, это поможет.

1 голос
/ 29 мая 2009

Возможно, вам нужны некоторые структуры для интерпретации, которые немного более удалены от исходной грамматики? Я не очень разбираюсь в PHP, но, похоже, вы действительно спрашиваете, как структурировать модель программы так, чтобы это было удобно для интерпретации. Я бы посчитал, что AST, сгенерированный через ANTLR, слишком близок к источнику для того, что вы хотите.

0 голосов
/ 29 июля 2009

Взгляните на phc абстрактную грамматику , это именно так. (Между прочим, это звучит так, как будто использование переднего конца phc лучше, чем изобретать колесо).

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 голосов
/ 29 мая 2009

Я бы посоветовал использовать JavaCC (или форк FreeCC) для анализа и сборки вашего AST. JavaCC генерирует синтаксический анализатор, который не имеет зависимостей во время выполнения. Трудно написать меньший / более быстрый анализатор, чем код, который генерирует JavaCC.

0 голосов
/ 27 мая 2009

Я обнаружил, что лучший метод в нисходящем компиляторе, лучший метод - это обрабатывать классы, как правило, как функции, в том смысле, что они являются просто узлами без необходимости оценивать аргументы перед тем, как спуститься в дерево.

Различия заключаются в исполнителе, который должен создать область выполнения для инкапсуляции методов и переменных, составляющих узел класса.

...