Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在基于抽象语法树的解释器中表示类_Java_Php_Compiler Construction_Interpreter_Abstract Syntax Tree - Fatal编程技术网

Java 如何在基于抽象语法树的解释器中表示类

Java 如何在基于抽象语法树的解释器中表示类,java,php,compiler-construction,interpreter,abstract-syntax-tree,Java,Php,Compiler Construction,Interpreter,Abstract Syntax Tree,我读过相关的问题,但没有一个能直接回答这个问题。我正在写一个PHP脚本解释器。我有AST为除类之外的所有对象生成适当的节点。处理类与处理函数有点不同,所以我想了解如何处理独立类以及扩展其他类的类 我已经研究过ANTLR,但我负担不起开销,因为这是针对嵌入式平台的。我要寻找的是ASTs中类背后的理论概念,以便它们可以由解释器的执行器部分执行。我发现,在自顶向下的编译器中,最好的方法是将类一般地像函数一样对待,因为它们只是节点,在进入树之前不需要计算参数 不同之处在于executor,它必须创建一个

我读过相关的问题,但没有一个能直接回答这个问题。我正在写一个PHP脚本解释器。我有AST为除类之外的所有对象生成适当的节点。处理类与处理函数有点不同,所以我想了解如何处理独立类以及扩展其他类的类


我已经研究过ANTLR,但我负担不起开销,因为这是针对嵌入式平台的。我要寻找的是ASTs中类背后的理论概念,以便它们可以由解释器的执行器部分执行。我发现,在自顶向下的编译器中,最好的方法是将类一般地像函数一样对待,因为它们只是节点,在进入树之前不需要计算参数


不同之处在于executor,它必须创建一个执行范围,在其中封装构成类节点的方法和变量。

也许您需要一些从源语法中删除一点的解释结构?我对PHP了解不多,但听起来你真的在问如何以便于解释的方式构造程序模型。我认为通过ANTLR生成的AST与您想要的源代码有点太接近。

ANTLR或多或少与您的问题无关

PHP中的类基本上是从字符串到属性的映射。每个属性都可以是公共的、私有的、受保护的。每个属性还保存一个值,该值可以是静态变量或方法。方法是(在PHP中)接受隐式$this参数的函数。因此,在PHP中,您可以将类基本上看作是一个奇特的数组对象

创建对象时,给它一个指向PHP类对象的指针。当您在该对象上调用一个方法时,您可以通过通过该指针获得的类对象来查找该方法

我希望这有帮助。

我建议使用JavaCC(或fork-FreeCC)来解析和构建AST。JavaCC生成一个没有运行时依赖项的解析器。很难编写比JavaCC生成的代码更小/更快的解析器

看看这个,它就是这样做的。(顺便说一句,使用phc的前端可能比重新发明轮子要好)


是的,但这会导致每次实例化该类时重新解释该对象的标记,对吗?我想这就是Google的V8和其他JavaScript实现之间的区别,我需要弄清楚这一点。谢谢你提供的信息。酷,我会看一看,我必须注意的一点是它与Dalvik字节码兼容,我发现大多数java.class文件都是,但有些不是JavaCC输出,只是几个java类文件。这些将使用常规编译器进行编译。FreeCC对泛型有更好的支持,所以我会使用您的编码java 1.5。谢谢您的帮助,我看看我是否可以使用它。谢谢保罗,我仍然在使用基于C++的客户端的PHC,但是我怎么能在Android(java/Dalvik)上使用它呢?我会假设本地应用程序是不可能的吗?那么,是否可以使用XML接口作为web服务?
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"?  ;