# Interface declarations foo; } } ==> Template( TextInterpolation(PhpOpen), InterfaceDeclaration(interface, Name, DeclarationList( MethodDeclaration( Visibility, function, Name, ParamList))), ClassDeclaration( class, Name, ClassInterfaceClause(implements, Name), DeclarationList( PropertyDeclaration( Visibility, VariableDeclarator(VariableName, AssignOp, String)), MethodDeclaration( Visibility, function, Name, ParamList, Block( ReturnStatement(return,MemberExpression( VariableName, Name))))))) # Use declarations Template( TextInterpolation(PhpOpen), TraitDeclaration(trait, Name, DeclarationList( UseDeclaration(use,Name), UseDeclaration(use,Name, Name, UseList), UseDeclaration(use,Name, Name))), ClassDeclaration( class, Name, DeclarationList( UseDeclaration(use, Name, UseList( UseAsClause(Name, as, Visibility), UseAsClause(ScopedExpression(Name, ClassMemberName(Name)), as, Name), UseAsClause(ScopedExpression(Name, ClassMemberName(Name)), as, Name)))))) # Namespace names in namespaces Template( TextInterpolation(PhpOpen), NamespaceDefinition(namespace, QualifiedName(NamespaceName(Name), Name), Block( ClassDeclaration(class, Name, DeclarationList), ClassDeclaration(class, Name, DeclarationList)))) # Class declarations Name = $name; $GLOBALS['List']->echoName(); } function echoName() { $GLOBALS['names'][]=$this->Name; } } ==> Template( TextInterpolation(PhpOpen), ClassDeclaration(class, Name, DeclarationList( MethodDeclaration(function, Name, ParamList( Parameter( VariableName)), Block( ExpressionStatement(AssignmentExpression( SubscriptExpression(VariableName, String), AssignOp, VariableName)), ExpressionStatement(AssignmentExpression( MemberExpression( VariableName, Name), AssignOp, VariableName)), ExpressionStatement(CallExpression( MemberExpression(SubscriptExpression(VariableName, String), Name), ArgList)))), MethodDeclaration(function, Name, ParamList, Block( ExpressionStatement(AssignmentExpression( SubscriptExpression(SubscriptExpression(VariableName, String)), AssignOp, MemberExpression(VariableName,Name)))))))) # Class declarations with base classes Template( TextInterpolation(PhpOpen), ClassDeclaration(class, Name, BaseClause(extends, Name), DeclarationList)) # Function parameters Template( TextInterpolation(PhpOpen), FunctionDefinition(function, Name, ParamList( Parameter( NamedType(Name), VariableName), VariadicParameter( NamedType(Name), VariableName)), Block)) # Functions with default parameters Template( TextInterpolation(PhpOpen), FunctionDefinition(function, Name, ParamList( Parameter( VariableName, AssignOp, ScopedExpression(Name, ClassMemberName(Name)))), Block(EchoStatement(echo,VariableName)))) # Static variables in functions Template( TextInterpolation(PhpOpen), FunctionDefinition(function, Name, ParamList, Block( FunctionStaticDeclaration(static, VariableDeclarator(VariableName, AssignOp, Integer), VariableDeclarator(VariableName, AssignOp, Integer))))) # Defining Constants Template( TextInterpolation(PhpOpen), ExpressionStatement( CallExpression( Name, ArgList(String,String) ) ), ConstDeclaration(const, VariableDeclarator( Name, AssignOp, String ) ), ConstDeclaration(const, VariableDeclarator( Name, AssignOp, BinaryExpression( Name, ConcatOp, String ) ) ), ConstDeclaration(const, VariableDeclarator( Name, AssignOp, ArrayExpression(array, ValueList(String,String,String)) ) ), ExpressionStatement( CallExpression( Name, ArgList( String, ArrayExpression(array, ValueList(String,String,String)) ) ) ) ) # Attributes "value"))] #[MyAttribute(100 + 200)] class Thing { } ==> Template( TextInterpolation(PhpOpen), FunctionDefinition( Attributes(Attribute(Name)), function, Name, ParamList( Parameter( Attributes(Attribute(Name)), VariableName ) ), Block(ExpressionStatement(VariableName)) ), ClassDeclaration(class, Name, DeclarationList( ConstDeclaration( Attributes(Attribute(Name)), const, VariableDeclarator(Name, AssignOp, String) ), PropertyDeclaration( Attributes(Attribute(Name)), Visibility, NamedType(Name), VariableDeclarator(VariableName, AssignOp, String) ), MethodDeclaration( Attributes( Attribute( Name, ArgList( String, ArrayExpression(String) ) ) ), Visibility, function, Name, ParamList( Parameter( Attributes(Attribute(Name)), VariableName ) ), Block(BlockComment) ) ) ), ClassDeclaration( Attributes(Attribute(Name)), Attributes(Attribute(QualifiedName(NamespaceName(Name),Name))), Attributes(Attribute(Name,ArgList(Integer))), Attributes(Attribute(Name,ArgList(ScopedExpression(Name,ClassMemberName(Name))))), Attributes(Attribute(Name,ArgList(ArrayExpression(array, ValueList(Pair(String, String)))))), Attributes(Attribute(Name,ArgList(BinaryExpression(Integer, ArithOp, Integer)))), class, Name, DeclarationList ) ) # Enums 'Red', Suit::Clubs, Suit::Spades => 'Black', }; } } ==> Template( TextInterpolation(PhpOpen), EnumDeclaration(enum, Name, EnumBody ), EnumDeclaration(enum, Name, ClassInterfaceClause(implements, Name, Name), EnumBody ), EnumDeclaration(enum, Name, NamedType(Name), ClassInterfaceClause(implements, Name), EnumBody ), EnumDeclaration(enum, Name, NamedType(Name), EnumBody( EnumCase(case, Name, AssignOp, String), EnumCase(case, Name), EnumCase(case, Name, AssignOp, String), EnumCase(case, Name, AssignOp, String), LineComment, MethodDeclaration( Visibility, function, Name, ParamList, NamedType(Name), Block( ReturnStatement(return, MatchExpression(match, ParenthesizedExpression( VariableName ), MatchBlock( MatchArm( ScopedExpression(Name, ClassMemberName(Name)), ScopedExpression(Name, ClassMemberName(Name)), String ), MatchArm( ScopedExpression(Name, ClassMemberName(Name)), ScopedExpression(Name, ClassMemberName(Name)), String ) ) ) ) ) ) ) ) )