From: Baptiste L. <bl...@us...> - 2004-08-08 19:15:44
|
Update of /cvsroot/cpptool/CppParser/src/pyrfta In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv2889/src/pyrfta Modified Files: ast.py dumpast.py Log Message: * fixed assignment operator * added new operator Index: ast.py =================================================================== RCS file: /cvsroot/cpptool/CppParser/src/pyrfta/ast.py,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** ast.py 8 Aug 2004 17:26:34 -0000 1.8 --- ast.py 8 Aug 2004 19:15:31 -0000 1.9 *************** *** 341,347 **** self.init_declaration = simple_declaration ! class Condition(ASTElement): def __init__( self, node ): self.node = node class BreakStatement(Statement): --- 341,355 ---- self.init_declaration = simple_declaration ! class ExpressionCondition(ASTElement): ! def __init__( self, node, expression ): ! self.node = node ! self.expression = expression ! ! class DeclarationCondition(ASTElement): def __init__( self, node ): self.node = node + self.type_specifier = None + self.declarator = None + self.expression = None class BreakStatement(Statement): *************** *** 420,432 **** pass ! class BinaryExpression(ExpressionBase): def __init__( self, node ): ExpressionBase.__init__( self, node ) self.left_expression = None self.right_expression = None - class BinaryOperatorExpression(BinaryExpression): - pass # operator is first non silent symbol ? - class CallExpression(ExpressionBase): def __init__( self, node ): --- 428,438 ---- pass ! class BinaryOperatorExpression(ExpressionBase): def __init__( self, node ): ExpressionBase.__init__( self, node ) self.left_expression = None + self.operator_node = nodetools.getFirstTokenChildNode( node ) self.right_expression = None class CallExpression(ExpressionBase): def __init__( self, node ): *************** *** 454,457 **** --- 460,487 ---- self.expression = None + class ArrayAccessExpression(ExpressionBase): + def __init__( self, node ): + ExpressionBase.__init__( self, node ) + self.expression = None + self.index = None + + class NewOperatorExpression(ExpressionBase): + def __init__( self, node ): + ExpressionBase.__init__( self, node ) + self.placement_expression = None + self.new_type_id_node = None + + class UnaryOperatorExpression(ExpressionBase): + def __init__( self, node ): + ExpressionBase.__init__( self, node ) + self.expression = None + self.operator_node = nodetools.getFirstTokenChildNode( node ) + + class AssignmentOperatorExpression(BinaryOperatorExpression): + def __init__( self, node ): + ExpressionBase.__init__( self, node ) + self.left_expression = None + self.right_expression = None + ##################################### ##################################### *************** *** 502,506 **** ast = CaseStatement( statement ) value_node = nodetools.getFirstChildNamed( statement, 'constant_expression' ) ! #ast.setValue( ast.buildConstantExpression( value_node ) ) self.buildTargetStatement( ast, statement ) return ast --- 532,536 ---- ast = CaseStatement( statement ) value_node = nodetools.getFirstChildNamed( statement, 'constant_expression' ) ! ast.setValue( self.buildConstantExpression( value_node ) ) self.buildTargetStatement( ast, statement ) return ast *************** *** 566,570 **** def buildCondition( self, condition_node ): ! ast = Condition( condition_node ) return ast --- 596,613 ---- def buildCondition( self, condition_node ): ! expression_node = nodetools.tryGetFirstChildNamed( condition_node, 'expression' ) ! if expression_node: ! return ExpressionCondition( condition_node, ! self.buildExpression( expression_node ) ) ! ! ast = DeclarationCondition( condition_node ) ! type_specifier_node = nodetools.getFirstChildNamed( condition_node, 'type_specifier' ) ! ast.type_specifier = self.buildTypeSpecifier( type_specifier_node ) ! ! declarator_node = nodetools.getFirstChildNamed( condition_node, 'declarator' ) ! ast.declarator = Declarator( declarator_node ) ! ! init_node = nodetools.getFirstChildNamed( condition_node, 'assignment_expression' ) ! ast.expression = self.buildAssignementExpression( init_node ) return ast *************** *** 625,633 **** 'assignment_expression' : self.buildAssignementExpression, 'literal' : self.buildLiteralExpression, ! 'delete_operator' : self.buildDeleteOperator } def buildExpression( self, expression ): ! self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) def dispatchBuildExpression( self, expression ): --- 668,687 ---- 'assignment_expression' : self.buildAssignementExpression, 'literal' : self.buildLiteralExpression, ! 'delete_operator' : self.buildDeleteOperator, ! 'constant_expression' : self.buildConstantExpression, ! 'array_access' : self.buildArrayAccessExpression, ! 'unary_operator' : self.buildUnaryOperatorExpression, ! 'assignment_operator' : self.buildAssignmentOperatorExpression, ! 'new_operator' : self.buildNewOperatorExpression } + def buildAssignmentOperatorExpression( self, expression ): + ast = AssignmentOperatorExpression( expression ) + ast.left_expression = self.dispatchBuildExpression( nodetools.getCompositeChildAt( expression, 0 ) ) + ast.right_expression = self.dispatchBuildExpression( nodetools.getCompositeChildAt( expression, 1 ) ) + return ast + def buildExpression( self, expression ): ! return self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) def dispatchBuildExpression( self, expression ): *************** *** 642,656 **** return ast ! def buildCallOrConversionExpression( self, expression ): ! ast = CallOrConversionExpression( expression ) ! return ast ! ! def buildPostIncDecExpression( self, expression ): ! ast = PostIncDecExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstCompositeChild( expression ) ) return ast ! def buildIdExpression( self, expression ): ! return IdExpression( expression ) def buildBinaryOperatorExpression( self, expression ): --- 696,708 ---- return ast ! def buildArrayAccessExpression( self, expression ): ! ast = ArrayAccessExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) ! index_node = nodetools.getFirstChildNamed( expression, 'array_index' ) ! ast.index = self.buildExpression( nodetools.getFirstChildNamed( index_node, 'expression' ) ) return ast ! def buildAssignementExpression( self, expression ): ! return self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) def buildBinaryOperatorExpression( self, expression ): *************** *** 660,663 **** --- 712,720 ---- return ast + def buildCallOrConversionExpression( self, expression ): + ast = CallOrConversionExpression( expression ) + # todo + return ast + def buildCallExpression( self, expression ): ast = CallExpression( expression ) *************** *** 668,676 **** return ast ! def buildMemberAccessExpression( self, expression ): ! ast = MemberAccessExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) ! member_node = nodetools.getFirstChildNamed( expression, 'accessed_member' ) ! ast.member_node = member_node return ast --- 725,734 ---- return ast ! def buildConstantExpression( self, expression ): ! return self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) ! ! def buildDeleteOperator( self, expression ): ! ast = DeleteOperatorExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstCompositeChild( expression ) ) return ast *************** *** 681,693 **** return ast ! def buildAssignementExpression( self, expression ): ! return self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) def buildLiteralExpression( self, expression ): return LiteralExpression( expression ) ! def buildDeleteOperator( self, expression ): ! ast = DeleteOperatorExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstCompositeChild( expression ) ) return ast --- 739,772 ---- return ast ! def buildIdExpression( self, expression ): ! return IdExpression( expression ) def buildLiteralExpression( self, expression ): return LiteralExpression( expression ) ! def buildMemberAccessExpression( self, expression ): ! ast = MemberAccessExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) ! member_node = nodetools.getFirstChildNamed( expression, 'accessed_member' ) ! ast.member_node = member_node ! return ast ! ! def buildNewOperatorExpression( self, expression ): ! ast = NewOperatorExpression( expression ) ! placement_node = nodetools.tryGetFirstChildNamed( expression, 'new_placement' ) ! if placement_node: ! expression_list_node = nodetools.getFirstChildNamed( placement_expression, 'expression_list' ) ! ast.placement_expression = self.buildExpressionList( expression_list_node ) ! ast.new_type_id_node = nodetools.getFirstChildNamed( expression, 'new_type_id' ) ! return ast ! ! def buildPostIncDecExpression( self, expression ): ! ast = PostIncDecExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstCompositeChild( expression ) ) ! return ast ! ! def buildUnaryOperatorExpression( self, expression ): ! ast = UnaryOperatorExpression( expression ) ! ast.expression = self.dispatchBuildExpression( nodetools.getFirstCompositeChild( expression ) ) return ast Index: dumpast.py =================================================================== RCS file: /cvsroot/cpptool/CppParser/src/pyrfta/dumpast.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** dumpast.py 8 Aug 2004 16:19:09 -0000 1.6 --- dumpast.py 8 Aug 2004 19:15:31 -0000 1.7 *************** *** 102,105 **** --- 102,116 ---- ## Statements + ################################################################# + def visitBreakStatement( self, ast ): + info = ASTInfo( ast ) + return info + + def visitCaseStatement( self, ast ): + info = ASTInfo( ast ) + info.attr( 'value', self.visitASTNode( ast.value ) ) + info.attr( 'statement', self.visitASTNode( ast.statement ) ) + return info + def visitCompoundStatement( self, ast ): info = ASTInfo( ast ) *************** *** 109,114 **** --- 120,149 ---- return info + def visitContinueStatement( self, ast ): + info = ASTInfo( ast ) + return info + + def visitDeclarationCondition( self, ast ): + info = ASTInfo( ast ) + #info.attr( 'type_specifier', self.visitASTNode( ast.type_specifier ) ) + info.attr( 'declarator', self.visitASTNode( ast.declarator ) ) + info.attr( 'expression', self.visitASTNode( ast.expression ) ) + return info + + def visitDeclarationStatement( self, ast ): + info = ASTInfo( ast ) + info.attr( 'declaration', self.visitASTNode( ast.declaration ) ) + return info + + def visitDefaultStatement( self, ast ): + return self.visitLabelStatement( ast ) + + def visitExpressionCondition( self, ast ): + return self.visitASTNode( ast.expression ) + def visitExpressionStatement( self, ast ): info = ASTInfo( ast ) + if ast.expression: + info.attr('expression', self.visitASTNode( ast.expression ) ) return info *************** *** 128,135 **** return self.visitASTNode( ast.init_declaration ) - def visitCondition( self, ast ): - info = ASTInfo( ast ) - return info - def visitIfStatement( self, ast ): info = ASTInfo( ast ) --- 163,166 ---- *************** *** 140,143 **** --- 171,185 ---- return info + def visitLabelStatement( self, ast ): + info = ASTInfo( ast ) + info.attr( 'statement', self.visitASTNode( ast.statement ) ) + return info + + def visitSwitchStatement( self, ast ): + info = ASTInfo( ast ) + info.attr( 'condition', self.visitASTNode( ast.condition ) ) + info.attr( 'statement', self.visitASTNode( ast.statement ) ) + return info + def visitTryBlockStatement( self, ast ): info = ASTInfo( ast ) *************** *** 153,189 **** return info ! def visitDeclarationStatement( self, ast ): info = ASTInfo( ast ) ! info.attr( 'declaration', self.visitASTNode( ast.declaration ) ) return info ! def visitSwitchStatement( self, ast ): info = ASTInfo( ast ) ! info.attr( 'condition', self.visitASTNode( ast.condition ) ) ! info.attr( 'statement', self.visitASTNode( ast.statement ) ) return info ! def visitCaseStatement( self, ast ): info = ASTInfo( ast ) - # info.attr( 'value', self.visitASTNode( ast.value ) ) - info.attr( 'statement', self.visitASTNode( ast.statement ) ) return info ! def visitLabelStatement( self, ast ): info = ASTInfo( ast ) ! info.attr( 'statement', self.visitASTNode( ast.statement ) ) return info ! def visitDefaultStatement( self, ast ): ! return self.visitLabelStatement( ast ) ! def visitBreakStatement( self, ast ): info = ASTInfo( ast ) return info ! def visitContinueStatement( self, ast ): info = ASTInfo( ast ) return info - --- 195,274 ---- return info ! ## Expressions ! ################################################################# ! def visitArrayAccessExpression( self, ast ): info = ASTInfo( ast ) ! info.attr( 'expression', self.visitASTNode( ast.expression ) ) ! info.attr( 'index', self.visitASTNode( ast.index ) ) return info ! def visitAssignmentOperatorExpression( self, ast ): info = ASTInfo( ast ) ! info.attr( 'left', self.visitASTNode( ast.left_expression ) ) ! info.attr( 'right', self.visitASTNode( ast.right_expression ) ) ! return info ! ! def visitBinaryOperatorExpression( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'left', self.visitASTNode( ast.left_expression ) ) ! info.attr( 'operator', ast.operator_node.text ) ! info.attr( 'right', self.visitASTNode( ast.right_expression ) ) ! return info ! ! def visitCallExpression( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'callee', self.visitASTNode( ast.callee ) ) ! info.attr( 'parameters', [] ) ! for parameter in ast.parameters: ! info.attr( 'parameters' ).append( self.visitASTNode( parameter ) ) return info ! def visitCallOrConversionExpression( self, ast ): info = ASTInfo( ast ) return info ! def visitDeleteOperatorExpression( self, ast ): info = ASTInfo( ast ) ! info.attr( 'expression', self.visitASTNode( ast.expression ) ) ! return info ! ! def visitExpressionList( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'list', [ self.visitASTNode( expression ) for expression in ast.expressions ] ) ! return info ! ! def visitIdExpression( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'id', self._nodeTreeSource( ast.node ) ) ! return info ! ! def visitLiteralExpression( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'literal', self._nodeTreeSource( ast.node ) ) return info ! def visitMemberAccessExpression( self, ast ): ! info = ASTInfo( ast ) ! info.attr( 'expression', self.visitASTNode( ast.expression ) ) ! info.attr( 'member', self._nodeTreeSource( ast.member_node ) ) ! return info ! def visitNewOperatorExpression( self, ast ): info = ASTInfo( ast ) + if ast.placement_expression: + info.attr( 'placement_expression', self.visitASTNode( ast.placement_expression ) ) + info.attr( 'type', self._nodeTreeSource( ast.new_type_id_node ) ) return info ! def visitPostIncDecExpression( self, ast ): info = ASTInfo( ast ) + info.attr( 'expression', self.visitASTNode( ast.expression ) ) + return info + + def visitUnaryOperatorExpression( self, ast ): + info = ASTInfo( ast ) + info.attr( 'operator', ast.operator_node.text ) + info.attr( 'expression', self.visitASTNode( ast.expression ) ) return info |