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