package chocopy.common.analysis; import chocopy.common.astnodes.*; /** * This interface can be used to separate logic for various concrete classes in the AST class * hierarchy. * *

The idea is that a phase of the analysis is encapsulated in a class that implements this * interface, and contains an overriding of the analyze method for each concrete Node class that * needs something other than default processing. Each concrete node class, C, implements a generic * dispatch method that takes a NodeAnalyzer argument and calls the overloading of analyze that * takes an argument of type C. The effect is that anode.dispatch(anAnalyzer) executes the method * anAnalyzer.analyze that is appropriate to aNode's dynamic type. As a result each NodeAnalyzer * subtype encapsulates all implementations of a particular action on Nodes. Thus, it inverts the * usual OO pattern in which the implementations of analysis A for each different class are * scattered among the class bodies themselves as overridings of a method A on the Node class. * *

The class AbstractNodeAnalyzer provides empty default implementations for these methods. * *

The type T is the type of result returned by the encapsulated analysis. */ public interface NodeAnalyzer { T analyze(AssignStmt node); T analyze(BinaryExpr node); T analyze(BooleanLiteral node); T analyze(CallExpr node); T analyze(ClassDef node); T analyze(ClassType node); T analyze(CompilerError node); T analyze(Errors node); T analyze(ExprStmt node); T analyze(ForStmt node); T analyze(FuncDef node); T analyze(GlobalDecl node); T analyze(Identifier node); T analyze(IfExpr node); T analyze(IfStmt node); T analyze(IndexExpr node); T analyze(IntegerLiteral node); T analyze(ListExpr node); T analyze(ListType node); T analyze(MemberExpr node); T analyze(MethodCallExpr node); T analyze(NoneLiteral node); T analyze(NonLocalDecl node); T analyze(Program node); T analyze(ReturnStmt node); T analyze(StringLiteral node); T analyze(TypedVar node); T analyze(UnaryExpr node); T analyze(VarDef node); T analyze(WhileStmt node); /** * Set the default value returned by calls to analyze that are not overridden to VALUE. By * default, this is null. */ void setDefault(T value); /** Default value for non-overridden methods. */ T defaultAction(Node node); }