|
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
|