From: <bl...@us...> - 2003-08-03 08:50:33
|
Update of /cvsroot/cpptool/rfta/src/pyrfta/test/rfta In directory sc8-pr-cvs1:/tmp/cvs-serv9037/src/pyrfta/test/rfta Modified Files: generateparserdebuginfo.py parser.py parsertest.py Log Message: * added grammar for expression * added one_of_p() parser * added some missing symbols to tokenizer Index: generateparserdebuginfo.py =================================================================== RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/generateparserdebuginfo.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** generateparserdebuginfo.py 2 Aug 2003 21:29:08 -0000 1.1 --- generateparserdebuginfo.py 3 Aug 2003 08:50:30 -0000 1.2 *************** *** 3,7 **** 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): --- 3,7 ---- import string ! factories = string.split( 'make_p terminal_p symbol_p maybe_p repeat_p list_p anyuntil_p proxy_p one_of_p' ) for var in dir(parser): Index: parser.py =================================================================== RCS file: /cvsroot/cpptool/rfta/src/pyrfta/test/rfta/parser.py,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** parser.py 2 Aug 2003 21:29:08 -0000 1.6 --- parser.py 3 Aug 2003 08:50:30 -0000 1.7 *************** *** 83,87 **** ( FLOAT, '([0-9]+)?\\.[0-9]+(e[-+]?[0-9]+)?[fFL]?' ), ( FLOAT, '[0-9]+e[-+]?[0-9]+[fFL]?' ), ! ( SYMBOL, self._makeChoice( ':: << >> <= >= \\|\\| && &= \\|= \\+= -= /= \\*= \\^=' ) ), ( SYMBOL, self._makeChoice( '\\( \\) \\[ \\] \\{ \\} ~ / - \\+ / \\* = \\^ % < > & \\| ; , : \\?' ) ), ( CPP_COMMENT, '//' ), --- 83,87 ---- ( FLOAT, '([0-9]+)?\\.[0-9]+(e[-+]?[0-9]+)?[fFL]?' ), ( FLOAT, '[0-9]+e[-+]?[0-9]+[fFL]?' ), ! ( SYMBOL, self._makeChoice( '>>= <<= :: << >> <= >= \\|\\| && &= \\|= \\+= -= /= \\*= \\^= %=' ) ), ( SYMBOL, self._makeChoice( '\\( \\) \\[ \\] \\{ \\} ~ / - \\+ / \\* = \\^ % < > & \\| ; , : \\?' ) ), ( CPP_COMMENT, '//' ), *************** *** 698,701 **** --- 698,722 ---- self.parser = parser + class OneOfParser(Parser): + def __init__( self, symbols ): + Parser.__init__( self ) + self.symbols = string.split( symbols ) + + def parse( self, scanner ): + scanner.enterParser( self ) + token = scanner.getNextToken() + if token.getType() != SYMBOL or token.getText() not in self.symbols: + return self.notMatched( scanner ) + return self.matched( scanner, TokenNode( token ) ) + + def __str__( self ): + return 'one_of(%s)' % string.join( self.symbols, ' ' ) + + def useShortDebugTrace( self ): + return True + + def getDebugInfo( self ): + return str(self) + class InlineChildAction(Action): def __init__( self, node_index ): *************** *** 802,805 **** --- 823,829 ---- return ProxyParser() + def one_of_p( symbols ): + return OneOfParser( symbols ) + id_p = TerminalParser( IDENTIFIER ) *************** *** 889,905 **** # ############################## A.5: Expressions ############################ # A.5, C++PL3 p.798-802 - constant_expression_p = terminal_p(INTEGER) | terminal_p(CHAR) # dummy ! # dummy ! assignment_expression_p = constant_expression_p ! ##assignment_expression_p = proxy_p() ## ! ##assignment_expression_p.setParser( conditional_expression_p \ ! ## | ( logical_or_expression_p >> assignement_operator_p >> assignment_expression_p ) \ ! ## | throw_expression_p ) ! # dummy ! expression_list_p = constant_expression_p # ############################## A.6: Statements ############################ --- 913,1066 ---- # ############################## A.5: Expressions ############################ # A.5, C++PL3 p.798-802 ! operator_function_id_p = proxy_p() ! conversion_function_id_p = proxy_p() ! simple_type_specifier_p = proxy_p() ! ptr_operator_p = proxy_p() ! type_specifier_seq_p = proxy_p() ! throw_expression_p = proxy_p() ! expression_p = proxy_p() ! expression_list_p = proxy_p() ! cast_expression_p = proxy_p() ! assignment_expression_p = proxy_p() ! unary_expression_p = proxy_p() ! constant_expression_p = proxy_p() ! ! literal_expression_p = terminal_p(INTEGER) | terminal_p(CHAR) | terminal_p(FLOAT) ! ! # Notes: qualified_id can not include 'template' => A::template B::zozo is not parsed (IT SHOULD BE) ! qualified_id_p = nested_id_p >> maybe_p( symbol_p('template' ) >> id_p ) ! ! # Notes: destructor and template id not included ! unqualified_id_p = id_p \ ! | operator_function_id_p \ ! | conversion_function_id_p ! # | ( symbol_p('~') >> id_p ) \ ! # | template_id_p ! ! ! id_expression_p = unqualified_id_p | qualified_id_p ! ! primary_expression_p = literal_expression_p \ ! | 'this' \ ! | (symbol_p('::') >> id_p) \ ! | (symbol_p('::') >> operator_function_id_p) \ ! | (symbol_p('::') >> qualified_id_p) \ ! | (symbol_p('(') >> expression_p >> ')' ) \ ! | id_expression_p ! ! # Notes: missing template in scope case ! pseudo_destructor_name_p = maybe_p( nested_id_p >> '::' ) >> symbol_p('~') >> id_p ! ! instance_accessor_p = one_of_p('. ->') ! ! cast_keywords_p = one_of_p('dynamic_cast static_cast reinterpret_cast const_cast') ! ! # Notes: could not find actual grammar declaration. Fill in with a dummy rule ! type_id_p = nested_id_p ! ! # Notes: not included: ! # typename with template in scope ! # ! postfix_expression_p = proxy_p() ! postfix_expression_p.setParser( primary_expression_p ! | (postfix_expression_p >> '[' >> expression_p >> ']') # operator [] ! | (postfix_expression_p >> '(' >> maybe_p( expression_list_p ) >> ')') # operator () ! | (simple_type_specifier_p >> '(' >> maybe_p( expression_list_p ) >> ')') # simple type construction ! | (symbol_p('typename') >> nested_id_p >> '(' >> maybe_p( expression_list_p ) >> ')') # template construction ! | (postfix_expression_p >> instance_accessor_p >> maybe_p( 'template' ) >> maybe_p( '::' ) >> id_expression_p) # instance . id or instance -> id ! | (postfix_expression_p >> instance_accessor_p >> pseudo_destructor_name_p ) # destructor call ! | (postfix_expression_p >> (symbol_p('++') | '--')) ! | (cast_keywords_p >> '<' >> type_id_p >> '>' >> '(' >> expression_p >> ')') ! | (symbol_p('typeid') >> '(' >> expression_p >> ')') ! | (symbol_p('typeid') >> '(' >> type_id_p >> ')') ) ! ! cast_expression_p = unary_expression_p \ ! | (symbol_p('(') >> type_id_p >> ')') ! ! delete_expression_p = maybe_p( '::') >> 'delete' >> maybe_p('[]') >> cast_expression_p ! ! new_initializer_p = symbol_p('(') >> maybe_p( expression_list_p ) >> ')' ! ! expression_list_p.setParser( list_p( assignment_expression_p, ',' ) ) ! ! direct_new_declarator_p = repeat_p( 1, symbol_p('[') >> expression_p >> ']' ) \ ! >> maybe_p( symbol_p('[') >> constant_expression_p >> ']' ) ! ! new_declarator_p = proxy_p() ! new_declarator_p.setParser( (ptr_operator_p >> maybe_p( new_declarator_p )) ! | direct_new_declarator_p ) ! ! new_type_id_p = type_specifier_seq_p >> maybe_p( new_declarator_p ) ! ! new_placement_p = symbol_p( '(' ) >> expression_list_p >> ')' ! ! new_expression_p = (maybe_p( '::' ) >> 'new' >> maybe_p(new_placement_p) >> new_type_id_p >> maybe_p(new_initializer_p)) \ ! | (maybe_p( '::' ) >> 'new' >> maybe_p(new_placement_p) >> '(' >> new_type_id_p >> ')' >> maybe_p(new_initializer_p)) ! ! unary_operator_p = one_of_p( '* & + - ! ~' ) ! ! unary_expression_p.setParser( postfix_expression_p ! | ( (symbol_p('++') | '--') >> cast_expression_p ) ! | (unary_operator_p >> cast_expression_p) ! | (symbol_p( 'sizeof' ) >> unary_expression_p) ! | (symbol_p( 'sizeof' ) >> '(' >> unary_expression_p >> ')' ) ! | new_expression_p ! | delete_expression_p ) ! ! pm_expression_p = proxy_p() ! pm_expression_p.setParser( cast_expression_p ! | (pm_expression_p >> instance_accessor_p >> '*' >> cast_expression_p) ) ! ! ##multiplicative_expression_p = proxy_p() ! ##multiplicative_expression_p.setParser( pm_expression_p ! ## | ( multiplicative_expression_p >> one_of_p( '* / %' ) >> pm_expression_p) ) ## ! ##additive_expression_p = proxy_p() ! ##additive_expression_p.setParser( multiplicative_expression_p ! ## | ( additive_expression_p >> one_of_p( '+ -' ) >> multiplicative_expression_p ) ) ! ## ! ##shift_expression_p = proxy_p() ! ##shift_expression_p.setParser( additive_expression_p ! ## | ( shift_expression_p >> one_of_p( '>> <<' ) >> additive_expression_p ) ) ! ## ! ##relational_expression_p = proxy_p() ! ##relational_expression_p.setParser( shift_expression_p ! ## | ( relational_expression_p >> one_of_p( '< > <= >=' ) >> shift_expression_p ) ) ! ## ! ##equality_expression_p = proxy_p() ! ##equality_expression_p.setParser( relational_expression_p ! ## | ( equality_expression_p >> one_of_p( '== !=' ) >> relational_expression_p ) ) ! def binary_expr_p_factory( simple_expr_parser, symbols ): ! p = proxy_p() ! return simple_expr_parser | ( p >> one_of_p( symbols ) >> simple_expr_parser ) ! ! multiplicative_expression_p = binary_expr_p_factory( pm_expression_p, '* / %' ) ! additive_expression_p = binary_expr_p_factory( multiplicative_expression_p, '+ -' ) ! shift_expression_p = binary_expr_p_factory( additive_expression_p, '<< >>' ) ! relational_expression_p = binary_expr_p_factory( shift_expression_p, '< > <= >=' ) ! equality_expression_p = binary_expr_p_factory( relational_expression_p, '== !=' ) ! and_expression_p = binary_expr_p_factory( equality_expression_p, '&' ) ! exclusive_or_expression_p = binary_expr_p_factory( and_expression_p, '^' ) ! inclusive_or_expression_p = binary_expr_p_factory( exclusive_or_expression_p, '|' ) ! logical_and_expression_p = binary_expr_p_factory( inclusive_or_expression_p, '&&' ) ! logical_or_expression_p = binary_expr_p_factory( logical_and_expression_p, '||' ) ! ! conditional_expression_p = proxy_p() ! conditional_expression_p.setParser( logical_or_expression_p ! | ( conditional_expression_p >> '?' >> expression_p >> ':' >> assignment_expression_p ) ) ! ! assignment_operator_p = one_of_p( '= *= /= %= += -= >>= <<= &= ^= |=' ) ! ! assignment_expression_p.setParser( conditional_expression_p ! | (logical_or_expression_p >> assignment_operator_p >> assignment_expression_p) ! | throw_expression_p ) ! ! expression_p.setParser( assignment_expression_p ! | (expression_p >> ',' >> assignment_expression_p ) ) ! ! constant_expression_p.setParser( conditional_expression_p ) # ############################## A.6: Statements ############################ *************** *** 918,922 **** exception_specification_p = proxy_p() function_try_block_p = proxy_p() - ptr_operator_p = proxy_p() abstract_declarator_p = proxy_p() direct_abstract_declarator_p = proxy_p() --- 1079,1082 ---- *************** *** 985,989 **** init_declarator_list_p = list_p( init_declarator_p, ',' ) ! type_specifier_seq_p = repeat_p( 1, type_specifier_p ) # ############################## A.7: Declaration ############################ --- 1145,1149 ---- init_declarator_list_p = list_p( init_declarator_p, ',' ) ! type_specifier_seq_p.setParser( repeat_p( 1, type_specifier_p ) ) # ############################## A.7: Declaration ############################ *************** *** 1047,1052 **** # - opt(::) opt(nested-name-specifier) type-name # - opt(::) opt(nested-name-specifier) opt(tempalte) template-id ! simple_type_specifier_p = symbol_p('char') | 'wchar_t' | 'bool' | 'short' | 'int' | 'long' \ ! | 'signed' | 'unsigned' | 'float' | 'double' | 'void' storage_class_specifier_p = symbol_p('auto') | 'register' | 'static' | 'extern' | 'mutable' --- 1207,1211 ---- # - opt(::) opt(nested-name-specifier) type-name # - opt(::) opt(nested-name-specifier) opt(tempalte) template-id ! simple_type_specifier_p.setParser( one_of_p( 'char wchar_t bool short int long signed unsigned float double void' ) ) storage_class_specifier_p = symbol_p('auto') | 'register' | 'static' | 'extern' | 'mutable' *************** *** 1127,1130 **** --- 1286,1295 ---- # A.8.2, C++PL3 p.810 + conversion_declarator_p = repeat_p( 1, ptr_operator_p ) + + conversion_type_id_p = type_specifier_seq_p >> maybe_p( conversion_declarator_p ) + + conversion_function_id_p.setParser( symbol_p('operator') >> conversion_type_id_p ) + mem_initializer_id = nested_id_p *************** *** 1133,1136 **** --- 1298,1308 ---- ctor_initializer_p.setParser( symbol_p( ':' ) >> list_p( mem_initializer_p, ',' ) ) + # ############### A.8.2: Classes, OverLoading ################## + # A.8.3, C++PL3 p.810 + + operator_p = one_of_p( '+ - * / % ^ & | ~ ! = < > += -= *= /= %= ^= &= |= << >> >>= <<= == != <= >= && || ++ -- , ->* -> () []') \ + | ( one_of_p( 'new delete' ) >> maybe_p( '[]' ) ) + + operator_function_id_p.setParser( symbol_p('operator') >> operator_p ) *************** *** 1138,1142 **** # A.10, C++PL3 p.812 ! throw_expression_p = symbol_p('throw') >> maybe_p( assignment_expression_p ) exception_declaration_p = (type_specifier_seq_p >> maybe_p( declarator_p | abstract_declarator_p )) \ --- 1310,1314 ---- # A.10, C++PL3 p.812 ! throw_expression_p.setParser( symbol_p('throw') >> maybe_p( assignment_expression_p ) ) exception_declaration_p = (type_specifier_seq_p >> maybe_p( declarator_p | abstract_declarator_p )) \ *************** *** 1161,1168 **** --- 1333,1343 ---- access_level_spec_p.setName( 'access_level_spec_p' ) access_specifier_p.setName( 'access_specifier_p' ) + additive_expression_p.setName( 'additive_expression_p' ) + and_expression_p.setName( 'and_expression_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' ) + assignment_operator_p.setName( 'assignment_operator_p' ) attribut_decl_p.setName( 'attribut_decl_p' ) attribut_modifiers_p.setName( 'attribut_modifiers_p' ) *************** *** 1172,1175 **** --- 1347,1352 ---- block_declaration_p.setName( 'block_declaration_p' ) block_statement_p.setName( 'block_statement_p' ) + cast_expression_p.setName( 'cast_expression_p' ) + cast_keywords_p.setName( 'cast_keywords_p' ) class_body_statements_p.setName( 'class_body_statements_p' ) class_decl_p.setName( 'class_decl_p' ) *************** *** 1183,1188 **** --- 1360,1369 ---- class_specifier_p.setName( 'class_specifier_p' ) compound_statement_p.setName( 'compound_statement_p' ) + conditional_expression_p.setName( 'conditional_expression_p' ) constant_expression_p.setName( 'constant_expression_p' ) constant_initializer_p.setName( 'constant_initializer_p' ) + conversion_declarator_p.setName( 'conversion_declarator_p' ) + conversion_function_id_p.setName( 'conversion_function_id_p' ) + conversion_type_id_p.setName( 'conversion_type_id_p' ) ctor_initializer_p.setName( 'ctor_initializer_p' ) cv_modifier_p.setName( 'cv_modifier_p' ) *************** *** 1194,1199 **** --- 1375,1382 ---- declaration_seq_p.setName( 'declaration_seq_p' ) declarator_p.setName( 'declarator_p' ) + delete_expression_p.setName( 'delete_expression_p' ) direct_abstract_declarator_p.setName( 'direct_abstract_declarator_p' ) direct_declarator_p.setName( 'direct_declarator_p' ) + direct_new_declarator_p.setName( 'direct_new_declarator_p' ) elaborated_type_specifier_p.setName( 'elaborated_type_specifier_p' ) end_p.setName( 'end_p' ) *************** *** 1202,1208 **** --- 1385,1394 ---- enumerator_p.setName( 'enumerator_p' ) eos_p.setName( 'eos_p' ) + equality_expression_p.setName( 'equality_expression_p' ) exception_declaration_p.setName( 'exception_declaration_p' ) exception_specification_p.setName( 'exception_specification_p' ) + exclusive_or_expression_p.setName( 'exclusive_or_expression_p' ) expression_list_p.setName( 'expression_list_p' ) + expression_p.setName( 'expression_p' ) friend_decl_p.setName( 'friend_decl_p' ) function_body_p.setName( 'function_body_p' ) *************** *** 1214,1218 **** --- 1400,1406 ---- handler_p.setName( 'handler_p' ) handler_seq_p.setName( 'handler_seq_p' ) + id_expression_p.setName( 'id_expression_p' ) id_p.setName( 'id_p' ) + inclusive_or_expression_p.setName( 'inclusive_or_expression_p' ) init_declarator_list_p.setName( 'init_declarator_list_p' ) init_declarator_p.setName( 'init_declarator_p' ) *************** *** 1220,1225 **** --- 1408,1417 ---- initializer_list_p.setName( 'initializer_list_p' ) initializer_p.setName( 'initializer_p' ) + instance_accessor_p.setName( 'instance_accessor_p' ) linkage_specification_begin_p.setName( 'linkage_specification_begin_p' ) linkage_specification_p.setName( 'linkage_specification_p' ) + literal_expression_p.setName( 'literal_expression_p' ) + logical_and_expression_p.setName( 'logical_and_expression_p' ) + logical_or_expression_p.setName( 'logical_or_expression_p' ) mem_initializer_p.setName( 'mem_initializer_p' ) member_declaration_p.setName( 'member_declaration_p' ) *************** *** 1229,1232 **** --- 1421,1425 ---- member_initializers_p.setName( 'member_initializers_p' ) member_specification_p.setName( 'member_specification_p' ) + multiplicative_expression_p.setName( 'multiplicative_expression_p' ) named_namespace_definition_p.setName( 'named_namespace_definition_p' ) namespace_alias_definition_p.setName( 'namespace_alias_definition_p' ) *************** *** 1234,1245 **** --- 1427,1452 ---- namespace_definition_p.setName( 'namespace_definition_p' ) nested_id_p.setName( 'nested_id_p' ) + new_declarator_p.setName( 'new_declarator_p' ) + new_expression_p.setName( 'new_expression_p' ) + new_initializer_p.setName( 'new_initializer_p' ) + new_placement_p.setName( 'new_placement_p' ) + new_type_id_p.setName( 'new_type_id_p' ) null_statement_p.setName( 'null_statement_p' ) + operator_function_id_p.setName( 'operator_function_id_p' ) + operator_p.setName( 'operator_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' ) + pm_expression_p.setName( 'pm_expression_p' ) + postfix_expression_p.setName( 'postfix_expression_p' ) + primary_expression_p.setName( 'primary_expression_p' ) + pseudo_destructor_name_p.setName( 'pseudo_destructor_name_p' ) ptr_operator_p.setName( 'ptr_operator_p' ) pure_specifier_p.setName( 'pure_specifier_p' ) + qualified_id_p.setName( 'qualified_id_p' ) qualified_namespace_specifier_p.setName( 'qualified_namespace_specifier_p' ) + relational_expression_p.setName( 'relational_expression_p' ) + shift_expression_p.setName( 'shift_expression_p' ) simple_declaration_p.setName( 'simple_declaration_p' ) simple_type_specifier_p.setName( 'simple_type_specifier_p' ) *************** *** 1250,1258 **** --- 1457,1469 ---- try_block_p.setName( 'try_block_p' ) type_id_list_p.setName( 'type_id_list_p' ) + type_id_p.setName( 'type_id_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' ) + unary_expression_p.setName( 'unary_expression_p' ) + unary_operator_p.setName( 'unary_operator_p' ) unnamed_namespace_definition_p.setName( 'unnamed_namespace_definition_p' ) + unqualified_id_p.setName( 'unqualified_id_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.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** parsertest.py 2 Aug 2003 21:29:08 -0000 1.5 --- parsertest.py 3 Aug 2003 08:50:30 -0000 1.6 *************** *** 63,67 **** def testSymbol( self ): ! symbols = string.split( ':: << >> <= >= || && &= |= += -= /= *= ^= ' \ '( ) [ ] { } ~ / - + / * = ^ % < > & | ; , : ? ' \ 'if else break continue for while do void int' ) --- 63,67 ---- def testSymbol( self ): ! symbols = string.split( ':: << >> <= >= || && &= |= += -= /= *= ^= %= >>= <<= ' \ '( ) [ ] { } ~ / - + / * = ^ % < > & | ; , : ? ' \ 'if else break continue for while do void int' ) |