Ignore:
Timestamp:
Sep 13, 2017, 3:09:12 PM (7 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
Children:
121c3c0
Parents:
7aa257ae
Message:

generalize types for encoded strings, and fold simple ExpressionNode? build routines into parser

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r7aa257ae r513e165  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Sep 12 10:00:29 2017
    13 // Update Count     : 672
     12// Last Modified On : Wed Sep 13 14:54:19 2017
     13// Update Count     : 683
    1414//
    1515
     
    250250        sepString( str, units, '"' );                                           // separate constant from units
    251251
    252         BasicType::Kind strtype = BasicType::Char;                      // default string type
    253         switch ( str[0] ) {                                                                     // str has >= 2 characters, i.e, null string ""
     252        Type * strtype;
     253        switch ( str[0] ) {                                                                     // str has >= 2 characters, i.e, null string "" => safe to look at subscripts 0/1
    254254          case 'u':
    255                 if ( str[1] == '8' ) break;                                             // utf-8 characters
    256                 strtype = BasicType::ShortUnsignedInt;
     255                if ( str[1] == '8' ) goto Default;                              // utf-8 characters => array of char
     256                // lookup type of associated typedef
     257                strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char16_t", false );
    257258                break;
    258259          case 'U':
    259                 strtype = BasicType::UnsignedInt;
     260                strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "char32_t", false );
    260261                break;
    261262          case 'L':
    262                 strtype = BasicType::SignedInt;
     263                strtype = new TypeInstType( Type::Qualifiers( Type::Const ), "wchar_t", false );
    263264                break;
     265          Default:                                                                                      // char default string type
     266          default:
     267                strtype = new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char );
    264268        } // switch
    265         ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), strtype ),
     269        ArrayType * at = new ArrayType( noQualifiers, strtype,
    266270                                                                        new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
    267271                                                                        false, false );
     
    344348
    345349Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) {
    346         Type * targetType = maybeMoveBuildType( decl_node );
    347         Expression * castArg = maybeMoveBuild< Expression >( expr_node );
    348         return new VirtualCastExpr( castArg, targetType );
     350        return new VirtualCastExpr( maybeMoveBuild< Expression >( expr_node ), maybeMoveBuildType( decl_node ) );
    349351} // build_virtual_cast
    350352
    351353Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) {
    352         UntypedMemberExpr * ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
    353         return ret;
     354        return new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
    354355} // build_fieldSel
    355356
     
    363364
    364365Expression * build_addressOf( ExpressionNode * expr_node ) {
    365                 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
     366        return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
    366367} // build_addressOf
    367368
     
    422423} // build_cond
    423424
    424 Expression * build_comma( ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
    425         return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) );
    426 } // build_comma
    427 
    428425Expression * build_attrexpr( NameExpr * var, ExpressionNode * expr_node ) {
    429426        return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) );
     
    449446        return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) );
    450447} // build_range
    451 
    452 Expression * build_asmexpr( ExpressionNode * inout, Expression * constraint, ExpressionNode * operand ) {
    453         return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );
    454 } // build_asmexpr
    455 
    456 Expression * build_valexpr( StatementNode * s ) {
    457         return new StmtExpr( dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(s) ) );
    458 } // build_valexpr
    459 
    460 Expression * build_typevalue( DeclarationNode * decl ) {
    461         return new TypeExpr( maybeMoveBuildType( decl ) );
    462 } // build_typevalue
    463448
    464449Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) {
Note: See TracChangeset for help on using the changeset viewer.