diff options
author | John Hodge (bugs) <tpg@mutabah.net> | 2017-06-04 21:23:24 +0800 |
---|---|---|
committer | John Hodge (bugs) <tpg@mutabah.net> | 2017-06-04 21:23:24 +0800 |
commit | 83dbb728f62306d2e43b2688dd0f2d320fd5b038 (patch) | |
tree | a064267bdf8d0455ed725140abfcbed3e04b2d4a /src/parse | |
parent | 0b9fd0014c8f32ecf299dae2ad1811dfb484af46 (diff) | |
parent | f19c75571c48588fb3816e8eb5b96f03474fbdf5 (diff) | |
download | mrust-83dbb728f62306d2e43b2688dd0f2d320fd5b038.tar.gz |
Merge branch 'master' of https://github.com/thepowersgang/mrustc
Diffstat (limited to 'src/parse')
-rw-r--r-- | src/parse/expr.cpp | 15 | ||||
-rw-r--r-- | src/parse/lex.cpp | 2 | ||||
-rw-r--r-- | src/parse/root.cpp | 8 |
3 files changed, 20 insertions, 5 deletions
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index bc17ea9e..28729b93 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -999,9 +999,18 @@ ExprNodeP Parse_ExprVal_StructLiteral(TokenStream& lex, AST::Path path) while( GET_TOK(tok, lex) == TOK_IDENT ) { auto name = mv$(tok.str()); - GET_CHECK_TOK(tok, lex, TOK_COLON); - ExprNodeP val = Parse_Stmt(lex); - items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) ); + + if( lex.lookahead(0) != TOK_COLON ) + { + ExprNodeP val = NEWNODE( AST::ExprNode_NamedValue, ::AST::Path(name) ); + items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) ); + } + else + { + GET_CHECK_TOK(tok, lex, TOK_COLON); + ExprNodeP val = Parse_Stmt(lex); + items.push_back( ::std::make_pair(::std::move(name), ::std::move(val)) ); + } if( GET_TOK(tok,lex) == TOK_BRACE_CLOSE ) break; diff --git a/src/parse/lex.cpp b/src/parse/lex.cpp index a92753d8..0587e443 100644 --- a/src/parse/lex.cpp +++ b/src/parse/lex.cpp @@ -466,11 +466,13 @@ Token Lexer::getTokenInt() else if(suffix == "i16") num_type = CORETYPE_I16; else if(suffix == "i32") num_type = CORETYPE_I32; else if(suffix == "i64") num_type = CORETYPE_I64; + else if(suffix == "i128") num_type = CORETYPE_I128; else if(suffix == "isize") num_type = CORETYPE_INT; else if(suffix == "u8") num_type = CORETYPE_U8; else if(suffix == "u16") num_type = CORETYPE_U16; else if(suffix == "u32") num_type = CORETYPE_U32; else if(suffix == "u64") num_type = CORETYPE_U64; + else if(suffix == "u128") num_type = CORETYPE_U128; else if(suffix == "usize") num_type = CORETYPE_UINT; else if(suffix == "f32") num_type = CORETYPE_F32; else if(suffix == "f64") num_type = CORETYPE_F64; diff --git a/src/parse/root.cpp b/src/parse/root.cpp index 3bdd34b1..5f8ed0a3 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -563,7 +563,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) else if(tok.type() == TOK_SEMICOLON) { // Unit-like struct - return AST::Struct(mv$(params), ::std::vector<AST::TupleItem>()); + return AST::Struct(mv$(params)); } else if(tok.type() == TOK_BRACE_OPEN) { @@ -594,7 +594,7 @@ AST::Struct Parse_Struct(TokenStream& lex, const AST::MetaItems& meta_items) } //if( items.size() == 0 ) // WARNING( , W000, "Use 'struct Name;' instead of 'struct Nam { };' ... ning-nong"); - return AST::Struct(::std::move(params), ::std::move(items)); + return AST::Struct(mv$(params), mv$(items)); } else { @@ -824,6 +824,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) CHECK_TOK(tok, TOK_IDENT); ::std::string name = mv$(tok.str()); + // Tuple-like variants if( GET_TOK(tok, lex) == TOK_PAREN_OPEN ) { ::std::vector<TypeRef> types; @@ -850,6 +851,7 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) GET_TOK(tok, lex); variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(types)) ); } + // Struct-like variants else if( tok.type() == TOK_BRACE_OPEN ) { ::std::vector<::AST::StructItem> fields; @@ -880,12 +882,14 @@ AST::Enum Parse_EnumDef(TokenStream& lex, const AST::MetaItems& meta_items) variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(fields)) ); } + // Value variants else if( tok.type() == TOK_EQUAL ) { auto node = Parse_Expr(lex); variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), mv$(node)) ); GET_TOK(tok, lex); } + // Unit variants else { variants.push_back( AST::EnumVariant(mv$(item_attrs), mv$(name), ::AST::Expr()) ); |