From: <bl...@us...> - 2003-08-27 21:38:42
|
Update of /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser In directory sc8-pr-cvs1:/tmp/cvs-serv11808 Modified Files: grammar.py grammartest.py node.py Added Files: facade.py Log Message: * cleaned up the ast structure * somewhat uniformised 'declarations' ast structure (parameter, constructor/destructor, function, declaration) * added a facade for the C++ parser --- NEW FILE: facade.py --- import grammar import tokenizer class CPPParser: """Facade for the C++ Parser.""" def parseText( self, source_text ): """Parse the specified text as a C++ File. Returns the 'translation_unit' AST node (instance of rfta.parser.node.Node. Returns None if the parsing fails (should never happen)""" tokens = tokenizer.CppScanner().tokenize( source_text ) scanner = grammar.TokenProvider( tokens, grammar.StructuredTokenStream(), None ) match = grammar.translation_unit_pi.parse( scanner ) if not match: return None root_node = scanner.getStructuredTokenStream().makeNodeTree() return root_node.getChildren()[0] def parseTextFile( self, path ): """Load the specified text file and parse it as a C++ File. Returns a tuple (text,root_ast_node), where root_ast_node is the 'translation_unit' AST node (instance of rfta.parser.node.Node, and text is the specified file text. Returns (text,None) if the parsing fails (should never happen)""" file_in = file(path, 'rt') text = file_in.read() file_in.close() return ( text, self.parseText( text ) ) Index: grammar.py =================================================================== RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser/grammar.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** grammar.py 26 Aug 2003 17:53:49 -0000 1.3 --- grammar.py 27 Aug 2003 21:38:38 -0000 1.4 *************** *** 345,349 **** | direct_abstract_declarator_p ) ! opt_parameter_decl_assign_p = optional_f( node_f( 'parameter_default_value', symbol_f('=') >> assignment_expression_pi ) ) --- 345,349 ---- | direct_abstract_declarator_p ) ! opt_parameter_decl_assign_p = optional_f( node_f( 'assign_initializer', symbol_f('=') >> assignment_expression_pi ) ) *************** *** 355,360 **** parameter_declaration_p = node_f( 'function_parameter', ! node_f('parameter_type', parameter_type_p) ! >> node_f('parameter_name', declarator_p | abstract_declarator_p) >> opt_parameter_decl_assign_p ) --- 355,360 ---- parameter_declaration_p = node_f( 'function_parameter', ! node_f('declaration_specifier', parameter_type_p) ! >> node_f('declarator', declarator_p | abstract_declarator_p) >> opt_parameter_decl_assign_p ) *************** *** 385,395 **** # removed infinite left recursion direct_declarator_p = proxy_f( ( declarator_id_p ! | (symbol_f('(') >> declarator_p >> ')') ) >> repeat_f( 0, direct_abstract_declarator_fn_suffix_p | direct_abstract_declarator_array_suffix_p ) ) # Notes: inversed order to parse pointer to member correctly. ! declarator_p.setParser( (ptr_operator_pi >> declarator_p) ! | direct_declarator_p ) initializer_list_p = list_f( initializer_clause_p, ',' ) --- 385,398 ---- # removed infinite left recursion direct_declarator_p = proxy_f( ( declarator_id_p ! | node_f('braced_declarator', symbol_f('(') >> declarator_p >> ')') ) >> repeat_f( 0, direct_abstract_declarator_fn_suffix_p | direct_abstract_declarator_array_suffix_p ) ) # Notes: inversed order to parse pointer to member correctly. ! # simplified => introduced repetition of ptr and discarded alternative ! #declarator_p.setParser( (ptr_operator_pi >> declarator_p) ! # | direct_declarator_p ) ! declarator_p.setParser( optional_f( node_f( 'ptr_operator_declarator', ! repeat_f(1, ptr_operator_pi) ) ) >> direct_declarator_p ) initializer_list_p = list_f( initializer_clause_p, ',' ) *************** *** 401,405 **** | (symbol_f('(') >> expression_list_pi >> ')') ! init_declarator_p = node_f( 'init_declarator', declarator_p >> optional_f( initializer_p ) ) init_declarator_list_p = node_f( 'init_declarators', list_f( init_declarator_p, ',' ) ) --- 404,408 ---- | (symbol_f('(') >> expression_list_pi >> ')') ! init_declarator_p = node_f( 'init_declarator', node_f('declarator', declarator_p) >> optional_f( initializer_p ) ) init_declarator_list_p = node_f( 'init_declarators', list_f( init_declarator_p, ',' ) ) *************** *** 525,529 **** ##decl_specifiers_p = buggy # node_f( 'decl_specifiers', repeat_f( 1, decl_specifier_p ) ) ! constructor_type_specifier_pi = optional_f(function_specifier_p) workaround_type_specifier_pi.setParser( --- 528,532 ---- ##decl_specifiers_p = buggy # node_f( 'decl_specifiers', repeat_f( 1, decl_specifier_p ) ) ! constructor_type_specifier_pi = optional_f( node_f('declaration_specifier', function_specifier_p) ) workaround_type_specifier_pi.setParser( *************** *** 587,592 **** constructor_declaration_p = constructor_type_specifier_pi >> function_declarator_p ! member_declarator_p = longuest_f( declarator_p >> optional_f(pure_specifier_p), ! declarator_p >> optional_f(constant_initializer_p), optional_f(id_p) >> ':' >> constant_expression_pi ) --- 590,595 ---- constructor_declaration_p = constructor_type_specifier_pi >> function_declarator_p ! member_declarator_p = longuest_f( node_f('declarator', declarator_p) >> optional_f(pure_specifier_p), ! node_f('declarator', declarator_p) >> optional_f(constant_initializer_p), optional_f(id_p) >> ':' >> constant_expression_pi ) Index: grammartest.py =================================================================== RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser/grammartest.py,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** grammartest.py 26 Aug 2003 17:53:50 -0000 1.3 --- grammartest.py 27 Aug 2003 21:38:38 -0000 1.4 *************** *** 487,493 **** def testDeclaratorParser( self ): ! self.checkParser( '& *var[10]', grammar.declarator_p ) ! self.checkParser( '*(fn)(int x,double)', grammar.declarator_p ) ! self.checkParser( 'MyClass::instance_', grammar.declarator_p ) def testInitializerParser( self ): --- 487,506 ---- def testDeclaratorParser( self ): ! self.checkProducedTree( '& *var[10]', grammar.declarator_p, ! TestNode( '', ! TestNode( 'ptr_operator_declarator', '&', '*' ), ! TestNode( 'declarator_id', ! JokerTestNode('unqualified_id') ), ! JokerTestNode( 'abstract_array_declarator' ) ) ) ! self.checkProducedNodes( 'MyClass::instance_', grammar.declarator_p, ! TestNode( 'declarator_id', JokerTestNode('qualified_id') ) ) ! self.checkParser( '(x)', grammar.declarator_p ) ! self.checkProducedTree( '(*fn)(int x,double)', grammar.declarator_p, ! TestNode( '', ! TestNode('braced_declarator', ! '(', TestNode( 'ptr_operator_declarator', '*' ), ! JokerTestNode( 'declarator_id' ), ! ')'), ! JokerTestNode( 'function_parameters' ) ) ) def testInitializerParser( self ): *************** *** 517,527 **** '(', TestNode('function_parameter', ! TestNode('parameter_type', fundamental_type_n('int')), ! TestNode('parameter_name', declarator_id_n( id_n('x')) ) ), ',', TestNode('function_parameter', ! TestNode('parameter_type', fundamental_type_n('int')), ! TestNode('parameter_name', declarator_id_n( id_n('y')) ), ! TestNode('parameter_default_value', '=', JokerTestNode('assignment_expression'))), ')' ) ) --- 530,540 ---- '(', TestNode('function_parameter', ! TestNode('declaration_specifier', fundamental_type_n('int')), ! TestNode('declarator', declarator_id_n( id_n('x')) ) ), ',', TestNode('function_parameter', ! TestNode('declaration_specifier', fundamental_type_n('int')), ! TestNode('declarator', declarator_id_n( id_n('y')) ), ! TestNode('assign_initializer', '=', JokerTestNode('assignment_expression'))), ')' ) ) *************** *** 681,685 **** TestNode( 'init_declarators', TestNode( 'init_declarator', ! declarator_id_n( id_n('x') ), TestNode( 'assign_initializer', '=', JokerTestNode( 'assignment_expression' ) ) ) ), --- 694,698 ---- TestNode( 'init_declarators', TestNode( 'init_declarator', ! TestNode( 'declarator', declarator_id_n( id_n('x') ) ), TestNode( 'assign_initializer', '=', JokerTestNode( 'assignment_expression' ) ) ) ), *************** *** 704,707 **** --- 717,722 ---- self.checkParser( 'void f() {}', grammar.declaration_pi ) self.checkParser( 'extern "C" int x;', grammar.declaration_pi ) + self.checkParser( 'int (*f)(int x) = count;', grammar.declaration_pi ) + self.checkParser( 'int (x) = 1234;', grammar.declaration_pi ) *************** *** 787,796 **** TestNode( 'member_declaration', TestNode( 'declaration_specifier', fundamental_type_n('void') ), ! declarator_id_n( id_n('initialize') ), ! TestNode( 'function_parameters', '(', ')' ), ';' ), TestNode( 'member_declaration', TestNode( 'declaration_specifier', fundamental_type_n('int') ), ! declarator_id_n( id_n('x_') ), ';' ), TestNode( 'using_declaration', 'using', --- 802,811 ---- TestNode( 'member_declaration', TestNode( 'declaration_specifier', fundamental_type_n('void') ), ! TestNode( 'declarator', declarator_id_n( id_n('initialize') ), ! TestNode( 'function_parameters', '(', ')' ) ), ';' ), TestNode( 'member_declaration', TestNode( 'declaration_specifier', fundamental_type_n('int') ), ! TestNode( 'declarator', declarator_id_n( id_n('x_') ) ), ';' ), TestNode( 'using_declaration', 'using', Index: node.py =================================================================== RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser/node.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** node.py 24 Aug 2003 21:00:36 -0000 1.1 --- node.py 27 Aug 2003 21:38:38 -0000 1.2 *************** *** 27,30 **** --- 27,48 ---- return len(self.getChildren()) > 0 + def hasChildOfType( self, type ): + return len(self.getChildrenOfType(type)) > 0 + + def getChildOfType( self, type ): + children = self.getChildrenOfType( type ) + if children: + return children[0] + return None + + def getChildrenOfType( self, types ): + if type(types) == type(''): + types = [ types ] + children_of_type = [] + for child in self.children: + if child.getType() in types: + children_of_type.append( child ) + return children_of_type + def isLeaf( self ): return False |