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