|
From: <bl...@us...> - 2003-08-02 21:29:11
|
Update of /cvsroot/cpptool/rfta/src/pyrfta/test/rfta
In directory sc8-pr-cvs1:/tmp/cvs-serv21750/src/pyrfta/test/rfta
Modified Files:
parser.py parsertest.py
Added Files:
generateparserdebuginfo.py
Log Message:
* added parser traces for debug
* script to generate parser name for debug (from variable)
--- NEW FILE: generateparserdebuginfo.py ---
# generate parser name for debug
import parser
import string
factories = string.split( 'make_p terminal_p symbol_p maybe_p repeat_p list_p anyuntil_p proxy_p' )
for var in dir(parser):
if var not in factories and len(var) > 2 and var[-2:] == '_p':
print "%s.setName( '%s' )" % (var,var)
Index: parser.py
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** parser.py 2 Aug 2003 18:33:53 -0000 1.5
--- parser.py 2 Aug 2003 21:29:08 -0000 1.6
***************
*** 304,307 ****
--- 304,308 ----
self.states = []
self.end_stream_token = Token( END_STREAM, 0, 2+3+2, "<<end>>" )
+ self.parser_depth = 0
def hasMoreToken( self ):
***************
*** 325,328 ****
--- 326,386 ----
self.states.pop()
+ def enterParser( self, parser ):
+ if parser.isActionParser():
+ return
+
+ if not parser.useShortDebugTrace():
+ self.printDebugMessage( "Entering %s <= %s" % (self.getParserInfo(parser),self.miniScannerStateReport()), True )
+ self.parser_depth += 1
+
+ def exitParser( self, parser, message ):
+ if parser.isActionParser():
+ return
+
+ if parser.useShortDebugTrace():
+ self.printDebugMessage( "%s: %s" % (message,self.getParserShortInfo(parser)) )
+ return
+ heading = "Parsed"
+ else:
+ heading = "Exiting "
+ self.printDebugMessage( "%s: %s %s => %s" % (message,heading,self.getParserInfo(parser), self.miniScannerStateReport()) )
+ if not parser.useShortDebugTrace():
+ self.parser_depth -= 1
+
+ def getParserShortInfo( self, parser ):
+ info = parser.getName()
+ if not info:
+ info = parser.getDebugInfo()
+ return info
+
+ def getParserInfo( self, parser ):
+ parser_type = string.split( parser.__class__.__name__, '.' )[-1]
+ return "%s[%s]" % (self.getParserShortInfo(parser),parser_type)
+
+ def miniScannerStateReport( self ):
+ self.pushState()
+ next_tokens = []
+ for index in range(10):
+ if not self.hasMoreToken():
+ break
+ token = self.getNextToken()
+ if token.getType() == SYMBOL:
+ next_tokens.append( token.getText() )
+ else:
+ next_tokens.append( "$%s(%s)" % (token.getType(), token.getText()) )
+ self.popState()
+ return "%d: %s" % (self.index,string.join( next_tokens,' ' ) )
+
+ def printDebugMessage( self, message, new_level = None ):
+ ## margin = ''
+ ## if new_level == None:
+ ## margin = '|' * self.parser_depth
+ ## else:
+ ## if self.parser_depth > 0:
+ ## margin = '|' * (self.parser_depth-1)
+ ## margin += "+"
+ margin = '.' * self.parser_depth
+ print margin + '>' + message
+
class Parser:
""" Top-level class for all sub-parser.
***************
*** 341,346 ****
to set the name of the node returned by parser.
"""
! def __init__( self, name = None ):
! self.action_on_match = None # not use, use a decoarator parser instead (ActionParser)
self.name = name
--- 399,403 ----
to set the name of the node returned by parser.
"""
! def __init__( self, name = '' ):
self.name = name
***************
*** 348,352 ****
self.name = name
! def getName( self, name ):
return self.name
--- 405,409 ----
self.name = name
! def getName( self ):
return self.name
***************
*** 369,380 ****
result_value is the node representing the matched parse tree.
"""
! if self.action_on_match:
! result_value = self.action_on_match( result_value )
return Match( True, result_value )
! def notMatched( self ):
""" Called on parse failure to create the Match object."""
return Match( False )
class AlternativeParser(Parser):
def __init__( self, alt1, alt2 ):
--- 426,446 ----
result_value is the node representing the matched parse tree.
"""
! scanner.exitParser( self, "MATCH" )
return Match( True, result_value )
! def notMatched( self, scanner ):
""" Called on parse failure to create the Match object."""
+ scanner.exitParser( self, "FAIL" )
return Match( False )
+ def useShortDebugTrace( self ):
+ return False
+
+ def getDebugInfo( self ):
+ return ""
+
+ def isActionParser(self):
+ return False
+
class AlternativeParser(Parser):
def __init__( self, alt1, alt2 ):
***************
*** 383,386 ****
--- 449,453 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
for alternative in self.alternatives:
scanner.pushState()
***************
*** 390,394 ****
return self.matched( scanner, result.getValue() )
scanner.popState()
! return self.notMatched()
def addAlternative( self, alt ):
--- 457,461 ----
return self.matched( scanner, result.getValue() )
scanner.popState()
! return self.notMatched( scanner )
def addAlternative( self, alt ):
***************
*** 409,417 ****
def parse( self, scanner ):
results = Node( self.node_name )
for subparser in self.subparsers:
result = subparser.parse( scanner )
if not result:
! return self.notMatched()
results.addChild( result.getValue() )
return self.matched( scanner, results )
--- 476,485 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
results = Node( self.node_name )
for subparser in self.subparsers:
result = subparser.parse( scanner )
if not result:
! return self.notMatched( scanner )
results.addChild( result.getValue() )
return self.matched( scanner, results )
***************
*** 433,439 ****
def parse( self, scanner ):
token = scanner.getNextToken()
if token.getType() != SYMBOL or token.getText() != self.text:
! return self.notMatched()
return self.matched( scanner, TokenNode( token ) )
--- 501,508 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
token = scanner.getNextToken()
if token.getType() != SYMBOL or token.getText() != self.text:
! return self.notMatched( scanner )
return self.matched( scanner, TokenNode( token ) )
***************
*** 441,444 ****
--- 510,519 ----
return '"%s"' % self.text
+ def useShortDebugTrace( self ):
+ return True
+
+ def getDebugInfo( self ):
+ return self.text
+
class ActionParser(Parser):
def __init__( self, parser, action ):
***************
*** 447,459 ****
self.action = action
def parse( self, scanner ):
result = self.parser.parse( scanner )
if result:
return self.action( result.getValue() )
! return self.notMatched()
def __str__( self ):
return "(%s)[action]" % str(self.parser)
class Action: # matched & notMatched really need to be moved somewhere else (free function ?)
def matched( self, node ):
--- 522,543 ----
self.action = action
+ def setName( self, name ):
+ Parser.setName( self, name )
+ if self.parser.getName() == '':
+ self.parser.setName( name )
+
def parse( self, scanner ):
+ scanner.enterParser( self )
result = self.parser.parse( scanner )
if result:
return self.action( result.getValue() )
! return self.notMatched( scanner )
def __str__( self ):
return "(%s)[action]" % str(self.parser)
+ def isActionParser(self):
+ return True
+
class Action: # matched & notMatched really need to be moved somewhere else (free function ?)
def matched( self, node ):
***************
*** 513,516 ****
--- 597,601 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
scanner.pushState()
result = self.optional_parser.parse( scanner )
***************
*** 531,534 ****
--- 616,620 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
results = Node( '?' )
repeat_count = 0
***************
*** 543,547 ****
if repeat_count >= self.min_count:
return self.matched( scanner, results )
! return self.notMatched()
def __str__( self ):
--- 629,633 ----
if repeat_count >= self.min_count:
return self.matched( scanner, results )
! return self.notMatched( scanner )
def __str__( self ):
***************
*** 558,561 ****
--- 644,648 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
results = Node( '?' )
while True:
***************
*** 577,583 ****
def parse( self, scanner ):
token = scanner.getNextToken()
if token.getType() != self.type:
! return self.notMatched()
return self.matched( scanner, TokenNode( token ) )
--- 664,671 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
token = scanner.getNextToken()
if token.getType() != self.type:
! return self.notMatched( scanner )
return self.matched( scanner, TokenNode( token ) )
***************
*** 590,596 ****
def parse( self, scanner ):
token = scanner.getNextToken()
if token.getType() != INTEGER or token.getText() != '0':
! return self.notMatched()
return self.matched( scanner, TokenNode( token ) )
--- 678,685 ----
def parse( self, scanner ):
+ scanner.enterParser( self )
token = scanner.getNextToken()
if token.getType() != INTEGER or token.getText() != '0':
! return self.notMatched( scanner )
return self.matched( scanner, TokenNode( token ) )
***************
*** 1064,1065 ****
--- 1153,1258 ----
function_try_block_p.setParser( symbol_p('try') >> maybe_p(ctor_initializer_p) >> function_body_p >> handler_seq_p )
+
+
+ # #################################### Debug information for parser ###################
+ # generated using generateparserdebuginfo.py (Notes: could this be done dynamically ?)
+
+ abstract_declarator_p.setName( 'abstract_declarator_p' )
+ access_level_spec_p.setName( 'access_level_spec_p' )
+ access_specifier_p.setName( 'access_specifier_p' )
+ array_type_p.setName( 'array_type_p' )
+ asm_definition_p.setName( 'asm_definition_p' )
+ asm_keyword_p.setName( 'asm_keyword_p' )
+ assignment_expression_p.setName( 'assignment_expression_p' )
+ attribut_decl_p.setName( 'attribut_decl_p' )
+ attribut_modifiers_p.setName( 'attribut_modifiers_p' )
+ base_clause_p.setName( 'base_clause_p' )
+ base_specifier_p.setName( 'base_specifier_p' )
+ basic_type_spec_p.setName( 'basic_type_spec_p' )
+ block_declaration_p.setName( 'block_declaration_p' )
+ block_statement_p.setName( 'block_statement_p' )
+ class_body_statements_p.setName( 'class_body_statements_p' )
+ class_decl_p.setName( 'class_decl_p' )
+ class_head_name_p.setName( 'class_head_name_p' )
+ class_head_p.setName( 'class_head_p' )
+ class_inheritance_and_body_decl_p.setName( 'class_inheritance_and_body_decl_p' )
+ class_inheritance_p.setName( 'class_inheritance_p' )
+ class_key_p.setName( 'class_key_p' )
+ class_name_p.setName( 'class_name_p' )
+ class_specialization_p.setName( 'class_specialization_p' )
+ class_specifier_p.setName( 'class_specifier_p' )
+ compound_statement_p.setName( 'compound_statement_p' )
+ constant_expression_p.setName( 'constant_expression_p' )
+ constant_initializer_p.setName( 'constant_initializer_p' )
+ ctor_initializer_p.setName( 'ctor_initializer_p' )
+ cv_modifier_p.setName( 'cv_modifier_p' )
+ cv_qualifier_p.setName( 'cv_qualifier_p' )
+ cv_qualifier_seq_p.setName( 'cv_qualifier_seq_p' )
+ decl_specifier_p.setName( 'decl_specifier_p' )
+ decl_specifier_seq_p.setName( 'decl_specifier_seq_p' )
+ declaration_p.setName( 'declaration_p' )
+ declaration_seq_p.setName( 'declaration_seq_p' )
+ declarator_p.setName( 'declarator_p' )
+ direct_abstract_declarator_p.setName( 'direct_abstract_declarator_p' )
+ direct_declarator_p.setName( 'direct_declarator_p' )
+ elaborated_type_specifier_p.setName( 'elaborated_type_specifier_p' )
+ end_p.setName( 'end_p' )
+ enum_specifier_p.setName( 'enum_specifier_p' )
+ enumerator_definition_p.setName( 'enumerator_definition_p' )
+ enumerator_p.setName( 'enumerator_p' )
+ eos_p.setName( 'eos_p' )
+ exception_declaration_p.setName( 'exception_declaration_p' )
+ exception_specification_p.setName( 'exception_specification_p' )
+ expression_list_p.setName( 'expression_list_p' )
+ friend_decl_p.setName( 'friend_decl_p' )
+ function_body_p.setName( 'function_body_p' )
+ function_decl_p.setName( 'function_decl_p' )
+ function_definition_p.setName( 'function_definition_p' )
+ function_definition_start_p.setName( 'function_definition_start_p' )
+ function_specifier_p.setName( 'function_specifier_p' )
+ function_try_block_p.setName( 'function_try_block_p' )
+ handler_p.setName( 'handler_p' )
+ handler_seq_p.setName( 'handler_seq_p' )
+ id_p.setName( 'id_p' )
+ init_declarator_list_p.setName( 'init_declarator_list_p' )
+ init_declarator_p.setName( 'init_declarator_p' )
+ initializer_clause_p.setName( 'initializer_clause_p' )
+ initializer_list_p.setName( 'initializer_list_p' )
+ initializer_p.setName( 'initializer_p' )
+ linkage_specification_begin_p.setName( 'linkage_specification_begin_p' )
+ linkage_specification_p.setName( 'linkage_specification_p' )
+ mem_initializer_p.setName( 'mem_initializer_p' )
+ member_declaration_p.setName( 'member_declaration_p' )
+ member_declarator_list_p.setName( 'member_declarator_list_p' )
+ member_declarator_p.setName( 'member_declarator_p' )
+ member_function_modifiers_p.setName( 'member_function_modifiers_p' )
+ member_initializers_p.setName( 'member_initializers_p' )
+ member_specification_p.setName( 'member_specification_p' )
+ named_namespace_definition_p.setName( 'named_namespace_definition_p' )
+ namespace_alias_definition_p.setName( 'namespace_alias_definition_p' )
+ namespace_body_p.setName( 'namespace_body_p' )
+ namespace_definition_p.setName( 'namespace_definition_p' )
+ nested_id_p.setName( 'nested_id_p' )
+ null_statement_p.setName( 'null_statement_p' )
+ opt_parameter_decl_assign_p.setName( 'opt_parameter_decl_assign_p' )
+ optional_initializer_p.setName( 'optional_initializer_p' )
+ parameter_declaration_clause_p.setName( 'parameter_declaration_clause_p' )
+ parameter_declaration_p.setName( 'parameter_declaration_p' )
+ ptr_operator_p.setName( 'ptr_operator_p' )
+ pure_specifier_p.setName( 'pure_specifier_p' )
+ qualified_namespace_specifier_p.setName( 'qualified_namespace_specifier_p' )
+ simple_declaration_p.setName( 'simple_declaration_p' )
+ simple_type_specifier_p.setName( 'simple_type_specifier_p' )
+ statements_p.setName( 'statements_p' )
+ storage_class_specifier_p.setName( 'storage_class_specifier_p' )
+ template_instantiation_param_p.setName( 'template_instantiation_param_p' )
+ throw_expression_p.setName( 'throw_expression_p' )
+ try_block_p.setName( 'try_block_p' )
+ type_id_list_p.setName( 'type_id_list_p' )
+ type_p.setName( 'type_p' )
+ type_specifier_p.setName( 'type_specifier_p' )
+ type_specifier_seq_p.setName( 'type_specifier_seq_p' )
+ type_suffix_p.setName( 'type_suffix_p' )
+ unnamed_namespace_definition_p.setName( 'unnamed_namespace_definition_p' )
+ using_declaration_p.setName( 'using_declaration_p' )
+ using_directive_p.setName( 'using_directive_p' )
Index: parsertest.py
===================================================================
RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parsertest.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -C2 -d -r1.4 -r1.5
*** parsertest.py 2 Aug 2003 18:33:53 -0000 1.4
--- parsertest.py 2 Aug 2003 21:29:08 -0000 1.5
***************
*** 134,143 ****
self.checkParser( "otot", proxy_test_p )
- ## self.checkParser( "namespace { } ", parser.namespace_definition_p )
- ## self.checkParser( "namespace MyWork { } ", parser.namespace_definition_p )
self.checkParser( "namespace fs = boost::filesystem;", parser.namespace_alias_definition_p )
self.checkParser( "using typename boost::filesystem::path;", parser.using_declaration_p )
self.checkParser( "using boost::filesystem::path;", parser.using_declaration_p )
self.checkParser( "using namespace boost::filesystem;", parser.using_directive_p )
# self.checkParser( 'extern "C" { }', parser.declaration_p )
--- 134,143 ----
self.checkParser( "otot", proxy_test_p )
self.checkParser( "namespace fs = boost::filesystem;", parser.namespace_alias_definition_p )
self.checkParser( "using typename boost::filesystem::path;", parser.using_declaration_p )
self.checkParser( "using boost::filesystem::path;", parser.using_declaration_p )
self.checkParser( "using namespace boost::filesystem;", parser.using_directive_p )
+ # self.checkParser( "namespace { } ", parser.namespace_definition_p )
+ ## self.checkParser( "namespace MyWork { } ", parser.namespace_definition_p )
# self.checkParser( 'extern "C" { }', parser.declaration_p )
|