From: Baptiste L. <bl...@us...> - 2004-08-08 17:26:44
|
Update of /cvsroot/cpptool/CppParser/src/pyrfta In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv19513/src/pyrfta Modified Files: ast.py nodetools.py Log Message: * started wrapping expressions Index: nodetools.py =================================================================== RCS file: /cvsroot/cpptool/CppParser/src/pyrfta/nodetools.py,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** nodetools.py 8 Aug 2004 15:55:03 -0000 1.4 --- nodetools.py 8 Aug 2004 17:26:34 -0000 1.5 *************** *** 11,14 **** --- 11,32 ---- return node.childAt(0) + def getFirstCompositeChild( node ): + for child in node.enumChildren(): + if not child.hasValidToken(): + return child + raise AssertionError( "Fail to get first chil in node %s" % node ) + + def getCompositeChildAt( node, index ): + current_index = 0 + for child in node.enumChildren(): + if not child.hasValidToken(): + if current_index == index: + return child + current_index += 1 + raise AssertionError( "Fail to get first chil in node %s" % node ) + + def getCompositeChildren( node ): + return [ child for child in node.enumChildren() if not child.hasValidToken() ] + def getFirstChildNamed( node, name ): for child in node.enumChildren(): Index: ast.py =================================================================== RCS file: /cvsroot/cpptool/CppParser/src/pyrfta/ast.py,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** ast.py 8 Aug 2004 16:19:09 -0000 1.7 --- ast.py 8 Aug 2004 17:26:34 -0000 1.8 *************** *** 358,362 **** class ExpressionStatement(Statement): ! pass class DeclarationStatement(Statement): --- 358,367 ---- class ExpressionStatement(Statement): ! def __init__( self, node ): ! Statement.__init__( self, node ) ! self.expression = None ! ! def setExpression( self, expression ): ! self.expression = expression class DeclarationStatement(Statement): *************** *** 382,389 **** self.body = body # catch exception is missing, need more structure in input ! ! class ASTBuilder: def __init__( self ): ! self.current = None self.declaration_builders = { 'simple_declaration' : self.buildSimpleDeclaration, --- 387,699 ---- self.body = body # catch exception is missing, need more structure in input ! ! ## ################################################################## ! ## ################################################################## ! ## AST Expressions ! ## ################################################################## ! ## ################################################################## ! ! class ExpressionBase(ASTElement): ! def __init__( self, node ): ! self.node = node ! ! class Expression(ExpressionBase): ! pass ! ! class AssignementExpressionList(ExpressionBase): ! def __init__( self, node ): ! ExpressionBase.__init__( self, node ) ! self.expressions = [] ! ! def addExpression( self, expression ): ! self.expressions.append( expression ) ! ! class CallOrConversionExpression(ExpressionBase): ! pass ! ! class PostIncDecExpression(ExpressionBase): ! def __init__( self, node ): ! ExpressionBase.__init__( self, node ) ! self.expression = None # ++ / -- in 'post_operator' child ! ! class IdExpression(ExpressionBase): ! 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 ): ! ExpressionBase.__init__( self, node ) ! self.callee = None ! self.parameters = [] ! ! class MemberAccessExpression(ExpressionBase): ! def __init__( self, node ): # -> or . in child 'accessed_member' ! ExpressionBase.__init__( self, node ) ! self.expression = None ! self.member_node = None # id of the accessed member ! ! class ExpressionList(ExpressionBase): ! def __init__( self, node ): # -> or . in child 'accessed_member' ! ExpressionBase.__init__( self, node ) ! self.expressions = [] ! ! class LiteralExpression(ExpressionBase): ! pass ! ! class DeleteOperatorExpression(ExpressionBase): ! def __init__( self, node ): ! ExpressionBase.__init__( self, node ) ! self.expression = None ! ! ##################################### ! ##################################### ! ## Statements ! ##################################### ! ##################################### ! ! class ASTStatementsBuilder: def __init__( self ): ! self.statement_builders = { ! 'compound_statement' : self.buildCompoundStatement, ! 'error_statement' : self.buildErrorStatement, ! 'label_statement' : self.buildLabelStatement, ! 'case_statement' : self.buildCaseStatement, ! 'default_statement' : self.buildDefaultStatement, ! 'if_statement' : self.buildIfStatement, ! 'switch_statement' : self.buildSwitchStatement, ! 'while_statement' : self.buildWhileStatement, ! 'dowhile_statement' : self.buildDoWhileStatement, ! 'for_statement' : self.buildForStatement, ! 'break_statement' : self.buildBreakStatement, ! 'continue_statement' : self.buildContinueStatement, ! 'return_statement' : self.buildReturnStatement, ! 'goto_statement' : self.buildGotoStatement, ! 'expression_statement' : self.buildExpressionStatement, ! 'declaration_statement' : self.buildDeclarationStatement, ! 'try_block' : self.buildTryBlockStatement ! } ! ! def buildStatement( self, statement_node ): ! return self.statement_builders[ statement_node.name ]( statement_node ) ! ! def buildErrorStatement( self, statement ): ! return ErrorStatement( statement ) ! ! def buildCompoundStatement( self, statement ): ! ast = CompoundStatement( statement ) ! for child in statement.enumChildren(): ! if not child.hasValidToken(): ! statement = self.buildStatement( child ) ! ast.addStatement( statement ) ! return ast ! ! def buildLabelStatement( self, statement ): ! return self.buildTargetStatement( LabelStatement( statement ), statement ) ! ! def buildCaseStatement( self, statement ): ! ast = CaseStatement( statement ) ! value_node = nodetools.getFirstChildNamed( statement, 'constant_expression' ) ! #ast.setValue( ast.buildConstantExpression( value_node ) ) ! self.buildTargetStatement( ast, statement ) ! return ast ! ! def buildDefaultStatement( self, statement ): ! return self.buildTargetStatement( DefaultStatement( statement ), statement ) ! ! def buildTargetStatement( self, ast, label_statement_node ): ! target_statement_node = nodetools.getFirstChildNamed( label_statement_node, 'target_statement' ) ! ast.setStatement( self.buildStatement( nodetools.getFirstChild( target_statement_node ) ) ) ! return ast ! ! def buildIfStatement( self, statement ): ! ast = IfStatement( statement ) ! condition_node = nodetools.getFirstChildNamed( statement, 'condition' ) ! ast.setCondition( self.buildCondition( condition_node ) ) ! statement_node = nodetools.getFirstChildNamed( statement, 'then_statement' ) ! ast.setThenStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) ! statement_node = nodetools.tryGetFirstChildNamed( statement, 'else_statement' ) ! if statement_node: ! ast.setElseStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) ! return ast ! ! def buildSwitchStatement( self, statement ): ! ast = SwitchStatement( statement ) ! condition_node = nodetools.getFirstChildNamed( statement, 'condition' ) ! ast.setCondition( self.buildCondition( condition_node ) ) ! statement_node = nodetools.getFirstChildNamed( statement, 'condition_statement' ) ! ast.setStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) ! return ast ! ! def buildWhileStatement( self, statement ): ! return WhileStatement( statement ) ! ! def buildDoWhileStatement( self, statement ): ! return DoWhileStatement( statement ) ! ! def buildForStatement( self, statement ): ! ast = ForStatement( statement ) ! for_init_statement_node = nodetools.getFirstChildNamed( statement, 'for_init_statement' ) ! init_node = nodetools.tryGetFirstChildNamed( for_init_statement_node, 'expression_statement' ) ! if init_node: ! init = ForInitStatement( self.buildExpressionStatement( init_node ) ) ! else: ! init_declaration_node = nodetools.getFirstChildNamed( for_init_statement_node, ! 'simple_declaration' ) ! init = ForInitDeclaration( self.buildSimpleDeclaration( init_declaration_node ) ) ! ast.setInit( init ) ! ! for_condition_node = nodetools.tryGetFirstChildNamed( statement, 'for_condition' ) ! if for_condition_node: ! ast.setCondition( self.buildCondition( for_condition_node ) ) ! ! expression_node = nodetools.tryGetFirstChildNamed( statement, 'expression' ) ! if expression_node: ! ast.setLoopExpression( self.buildExpression( expression_node ) ) ! ! for_loop_statement_node = nodetools.getFirstChild( nodetools.getFirstChildNamed( statement, ! 'for_loop_statement' ) ) ! loop_statement = self.buildStatement( for_loop_statement_node ) ! ast.setLoopStatement( loop_statement ) ! return ast ! ! def buildCondition( self, condition_node ): ! ast = Condition( condition_node ) ! return ast ! ! def buildBreakStatement( self, statement ): ! return BreakStatement( statement ) ! ! def buildContinueStatement( self, statement ): ! return ContinueStatement( statement ) ! ! def buildReturnStatement( self, statement ): ! return ReturnStatement( statement ) ! ! def buildGotoStatement( self, statement ): ! return GotoStatement( statement ) ! ! def buildExpressionStatement( self, statement ): ! ast = ExpressionStatement( statement ) ! expression_node = nodetools.tryGetFirstChildNamed( statement, 'expression' ) ! if expression_node: ! ast.setExpression( self.buildExpression( expression_node ) ) ! return ast ! ! def buildDeclarationStatement( self, statement ): ! ast = DeclarationStatement( statement ) ! declaration_node = nodetools.getFirstChild( statement ) ! declaration = self.declaration_builders[ declaration_node.name ]( declaration_node ) ! ast.setDeclaration( declaration ) ! return ast ! ! def buildTryBlockStatement( self, statement ): ! body = self.buildCompoundStatement( nodetools.getFirstChildNamed(statement, 'compound_statement') ) ! ast = TryBlockStatement( statement, body ) ! for child in nodetools.getChildrenNamed( statement, 'exception_handler' ): ! body_node = nodetools.getFirstChildNamed( child, 'compound_statement' ) ! handler = ExceptionHandler( child, self.buildCompoundStatement( body_node ) ) ! ast.addHandler( handler ) ! return ast ! ! ! ! ##################################### ! ##################################### ! ## Expressions ! ##################################### ! ##################################### ! ! class ASTExpressionsBuilder: ! def __init__( self ): ! self.expression_builders = { ! 'assignment_expression_list' : self.buildAssignementExpressionList, ! 'call_or_conversion_expression' : self.buildCallOrConversionExpression, ! 'post_incdec' : self.buildPostIncDecExpression, ! 'id_expression' : self.buildIdExpression, ! 'binary_operator' : self.buildBinaryOperatorExpression, ! 'call' : self.buildCallExpression, ! 'member_access' : self.buildMemberAccessExpression, ! 'expression_list' : self.buildExpressionList, ! 'assignment_expression' : self.buildAssignementExpression, ! 'literal' : self.buildLiteralExpression, ! 'delete_operator' : self.buildDeleteOperator ! } ! ! def buildExpression( self, expression ): ! self.dispatchBuildExpression( nodetools.getFirstChild( expression ) ) ! ! def dispatchBuildExpression( self, expression ): ! return self.expression_builders[ expression.name ]( expression ) ! ! def buildAssignementExpressionList( self, expression ): ! ast = AssignementExpressionList( expression ) ! for child in expression.enumChildren(): ! if not child.hasValidToken(): ! assignment_expression = self.dispatchBuildExpression( child ) ! ast.addExpression( assignment_expression ) ! 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 ): ! ast = BinaryOperatorExpression( expression ) ! ast.left_expression = self.dispatchBuildExpression( nodetools.getCompositeChildAt( expression, 0 ) ) ! ast.right_expression = self.dispatchBuildExpression( nodetools.getCompositeChildAt( expression, 1 ) ) ! return ast ! ! def buildCallExpression( self, expression ): ! ast = CallExpression( expression ) ! ast.callee = self.dispatchBuildExpression( nodetools.getCompositeChildAt( expression, 0 ) ) ! call_parameters_node = nodetools.getFirstChildNamed( expression, 'call_parameters' ) ! for parameter_node in nodetools.getCompositeChildren( call_parameters_node ): ! ast.parameters.append( self.dispatchBuildExpression( parameter_node ) ) ! 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 ! ! def buildExpressionList( self, expression ): ! ast = ExpressionList( expression ) ! for child in nodetools.getChildrenNamed( expression, 'assignment_expression' ): ! ast.expressions.append( self.dispatchBuildExpression( child ) ) ! 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 ! ! class ASTBuilder(ASTStatementsBuilder,ASTExpressionsBuilder): ! def __init__( self ): ! ASTStatementsBuilder.__init__( self ) ! ASTExpressionsBuilder.__init__( self ) self.declaration_builders = { 'simple_declaration' : self.buildSimpleDeclaration, *************** *** 415,438 **** 'member_error' : self.buildMemberErrorDeclaration } ! self.statement_builders = { ! 'compound_statement' : self.buildCompoundStatement, ! 'error_statement' : self.buildErrorStatement, ! 'label_statement' : self.buildLabelStatement, ! 'case_statement' : self.buildCaseStatement, ! 'default_statement' : self.buildDefaultStatement, ! 'if_statement' : self.buildIfStatement, ! 'switch_statement' : self.buildSwitchStatement, ! 'while_statement' : self.buildWhileStatement, ! 'dowhile_statement' : self.buildDoWhileStatement, ! 'for_statement' : self.buildForStatement, ! 'break_statement' : self.buildBreakStatement, ! 'continue_statement' : self.buildContinueStatement, ! 'return_statement' : self.buildReturnStatement, ! 'goto_statement' : self.buildGotoStatement, ! 'expression_statement' : self.buildExpressionStatement, ! 'declaration_statement' : self.buildDeclarationStatement, ! 'try_block' : self.buildTryBlockStatement ! } ! def buildTranslationUnit( self, root ): assert root.name == 'translation_unit' --- 725,729 ---- 'member_error' : self.buildMemberErrorDeclaration } ! def buildTranslationUnit( self, root ): assert root.name == 'translation_unit' *************** *** 616,741 **** # ? exception_specification return ast - - ##################################### - ## Statements - ##################################### - - def buildStatement( self, statement_node ): - return self.statement_builders[ statement_node.name ]( statement_node ) - - def buildErrorStatement( self, statement ): - return ErrorStatement( statement ) - - def buildCompoundStatement( self, statement ): - ast = CompoundStatement( statement ) - for child in statement.enumChildren(): - if not child.hasValidToken(): - statement = self.buildStatement( child ) - ast.addStatement( statement ) - return ast - - def buildLabelStatement( self, statement ): - return self.buildTargetStatement( LabelStatement( statement ), statement ) - - def buildCaseStatement( self, statement ): - ast = CaseStatement( statement ) - value_node = nodetools.getFirstChildNamed( statement, 'constant_expression' ) - #ast.setValue( ast.buildConstantExpression( value_node ) ) - self.buildTargetStatement( ast, statement ) - return ast - - def buildDefaultStatement( self, statement ): - return self.buildTargetStatement( DefaultStatement( statement ), statement ) - - def buildTargetStatement( self, ast, label_statement_node ): - target_statement_node = nodetools.getFirstChildNamed( label_statement_node, 'target_statement' ) - ast.setStatement( self.buildStatement( nodetools.getFirstChild( target_statement_node ) ) ) - return ast - - def buildIfStatement( self, statement ): - ast = IfStatement( statement ) - condition_node = nodetools.getFirstChildNamed( statement, 'condition' ) - ast.setCondition( self.buildCondition( condition_node ) ) - statement_node = nodetools.getFirstChildNamed( statement, 'then_statement' ) - ast.setThenStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) - statement_node = nodetools.tryGetFirstChildNamed( statement, 'else_statement' ) - if statement_node: - ast.setElseStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) - return ast - - def buildSwitchStatement( self, statement ): - ast = SwitchStatement( statement ) - condition_node = nodetools.getFirstChildNamed( statement, 'condition' ) - ast.setCondition( self.buildCondition( condition_node ) ) - statement_node = nodetools.getFirstChildNamed( statement, 'condition_statement' ) - ast.setStatement( self.buildStatement( nodetools.getFirstChild( statement_node ) ) ) - return ast - - def buildWhileStatement( self, statement ): - return WhileStatement( statement ) - - def buildDoWhileStatement( self, statement ): - return DoWhileStatement( statement ) - - def buildForStatement( self, statement ): - ast = ForStatement( statement ) - for_init_statement_node = nodetools.getFirstChildNamed( statement, 'for_init_statement' ) - init_node = nodetools.tryGetFirstChildNamed( for_init_statement_node, 'expression_statement' ) - if init_node: - init = ForInitStatement( self.buildExpressionStatement( init_node ) ) - else: - init_declaration_node = nodetools.getFirstChildNamed( for_init_statement_node, - 'simple_declaration' ) - init = ForInitDeclaration( self.buildSimpleDeclaration( init_declaration_node ) ) - ast.setInit( init ) - - for_condition_node = nodetools.tryGetFirstChildNamed( statement, 'for_condition' ) - if for_condition_node: - ast.setCondition( self.buildCondition( for_condition_node ) ) - - ## expression_node = nodetools.tryGetFirstChildNamed( statement, 'expression' ) - ## if expression_node: - ## ast.setLoopExpression( self.buildExpression( expression_node ) ) - - for_loop_statement_node = nodetools.getFirstChild( nodetools.getFirstChildNamed( statement, - 'for_loop_statement' ) ) - loop_statement = self.buildStatement( for_loop_statement_node ) - ast.setLoopStatement( loop_statement ) - return ast - - def buildCondition( self, condition_node ): - ast = Condition( condition_node ) - return ast - - def buildBreakStatement( self, statement ): - return BreakStatement( statement ) - - def buildContinueStatement( self, statement ): - return ContinueStatement( statement ) - - def buildReturnStatement( self, statement ): - return ReturnStatement( statement ) - - def buildGotoStatement( self, statement ): - return GotoStatement( statement ) - - def buildExpressionStatement( self, statement ): - return ExpressionStatement( statement ) - - def buildDeclarationStatement( self, statement ): - ast = DeclarationStatement( statement ) - declaration_node = nodetools.getFirstChild( statement ) - declaration = self.declaration_builders[ declaration_node.name ]( declaration_node ) - ast.setDeclaration( declaration ) - return ast - - def buildTryBlockStatement( self, statement ): - body = self.buildCompoundStatement( nodetools.getFirstChildNamed(statement, 'compound_statement') ) - ast = TryBlockStatement( statement, body ) - for child in nodetools.getChildrenNamed( statement, 'exception_handler' ): - body_node = nodetools.getFirstChildNamed( child, 'compound_statement' ) - handler = ExceptionHandler( child, self.buildCompoundStatement( body_node ) ) - ast.addHandler( handler ) - return ast - - --- 907,908 ---- |