Bir soyut sözdizimi ağacı Tabanlı Yorumculuk sınıflarını temsil etmek için nasıl

5 Cevap java

Ben ilgili soruları okudum, ama bunların hiçbiri doğrudan soru adres görünür. Ben bir PHP script tercüman yazmaya çalışıyorum. Ben sınıfları dışında her şey için uygun düğümleri üreten AST var. Sınıfları taşıma işlemefonksiyonları biraz daha farklı olduğunu, bu yüzden bağımsız olan sınıfları nasıl ele arıyorum, ve diğer sınıfları genişletmek.

Ben Antlr baktım, ama bu bir gömülü platform için olduğu gibi yükü göze alamaz. Onlar tercüman uygulamakla kısmı tarafından yürütülür, böylece Ne arıyorum FBDTÖ sınıfların arkasında kavramsal teori. Bu konuya özgü cevapları ile iyi bağlantıları kesinlikle takdir edilmektedir.

5 Cevap

ANTLR daha fazla veya daha az alakasız sorun değildir.

PHP A sınıfı temel nitelikleri dizeleri bir harita. Her nitelik, kamu, özel, korumalı olabilir. Her nitelik de statik bir değişken veya bir yöntem olabilir bir değer, tutar. Yöntemler (PHP) bir örtülü $ bu parametreyi almak işlevleri vardır. Yani PHP temelde bir fantezi dizi nesnesi olarak bir sınıfın düşünebilirsiniz.

Eğer bir nesne oluşturduğunuzda, PHP sınıf bir nesne ona bir işaretçi verir. Eğer bu nesne üzerinde bir yöntemini çağırdığınızda, bu işaretçi yoluyla almak sınıf nesnesi üzerinden yöntemini bakmak.

Bu yardımcı olur umarım.

Belki biraz daha kaldırılan kaynak dilbilgisi vardır yorumlanması için bazı yapıları ihtiyacınız var? PHP hakkında çok şey bilmiyorum, ama sen gerçekten yorumlanması için kullanışlı bir şekilde nasıl yapıyı program modeli soruyorsun gibi konuşuyorsun. Ne istediğinizi için kaynağına çok yakın bir bit gibi Antlr yoluyla oluşturulan bir AST kabul ediyorum.

Ben aşağı bir üst derleyici iyi yöntem, en iyi yöntem bu onlar sadece ağaca inen önce görüşlerin değerlendirilmesi gerek kalmadan düğümleri vardır, sadece işlevleri gibi genel sınıfları tedavi olduğunu bulduk.

Farklılıklar sınıf düğümü oluşturan yöntem ve değişkenleri saklanması hangi bir yürütme kapsamı oluşturmak için vardır infaz memuru, vardır.

Ben AST ayrıştırmak ve inşa etmek JavaCC (veya çatal Freecc) kullanarak öneririm. JavaCC hiçbir çalışma zamanı bağımlılıkları olan bir çözümleyici oluşturur. Bu JavaCC üretir kod daha küçük / daha hızlı ayrıştırıcı yazmak zor.

Bu tam olarak bunu yapıyor, phc abstract grammar bir göz atın. (Bu arada, bu tekerleği yeniden daha iyi olabilir PHC ön-uç kullanarak gibi geliyor).

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"?  ;