我已阅读相关问题,但似乎没有一个问题可以直接解决。我正在编写PHP脚本解释器。我有AST为除了类之外的所有东西生成适当的节点。处理类与处理函数有点不同,所以我正在寻找如何处理独立的类,以及扩展其他类的类。
我看过ANTLR,但是由于这是针对嵌入式平台的,我负担不起开销。我正在寻找的是概念上在AST中的类后面的理论,因此它们可以由解释器的执行器部分执行。明确感谢与此问题的具体答案的良好联系。
答案 0 :(得分:2)
ANTLR或多或少与您的问题无关。
PHP中的类基本上是从字符串到属性的映射。每个属性都可以是public,private,protected。每个属性还包含一个值,该值可以是静态变量或方法。方法是(在PHP中)采用隐式$ this参数的函数。所以你可以认为一个类基本上是PHP中的一个奇特的数组对象。
创建对象时,为其指定PHP类对象。当您在该对象上调用方法时,您将通过该对象查找该方法。
我希望这会有所帮助。
答案 1 :(得分:1)
也许您需要一些解释结构,这些结构会从源语法中删除一些?我对PHP知之甚少,但听起来你真正问的是如何以一种方便解释的方式构建程序模型。我认为通过ANTLR生成的AST与你想要的源太接近了。
答案 2 :(得分:0)
我发现自顶向下编译器中最好的方法,最好的方法是将类处理,就像函数一样,因为它们只是节点而不需要在下降到树之前评估参数。
不同之处在于执行程序,它必须创建一个执行范围,在其中封装构成类节点的方法和变量。
答案 3 :(得分:0)
我建议使用JavaCC(或者派对FreeCC)来解析和构建你的AST。 JavaCC生成一个没有运行时依赖性的解析器。编写比JavaCC生成的代码更小/更快的解析器很困难。
答案 4 :(得分:0)
看看phc abstract grammar,就是这样。 (顺便说一句,听起来好像使用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"? ;