From 88ba6d8015966d1a16806b31382d2663add74efc Mon Sep 17 00:00:00 2001 From: gingerBill Date: Sun, 21 Jan 2018 14:30:48 +0000 Subject: `enum #export` --- src/parser.cpp | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/parser.cpp') diff --git a/src/parser.cpp b/src/parser.cpp index 1c03af2e3..de246243a 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -947,10 +947,11 @@ AstNode *ast_union_type(AstFile *f, Token token, Array variants, AstN } -AstNode *ast_enum_type(AstFile *f, Token token, AstNode *base_type, Array fields) { +AstNode *ast_enum_type(AstFile *f, Token token, AstNode *base_type, bool is_export, Array fields) { AstNode *result = make_ast_node(f, AstNode_EnumType); result->EnumType.token = token; result->EnumType.base_type = base_type; + result->EnumType.is_export = is_export; result->EnumType.fields = fields; return result; } @@ -1933,17 +1934,36 @@ AstNode *parse_operand(AstFile *f, bool lhs) { } break; case Token_enum: { + bool is_export = false; Token token = expect_token(f, Token_enum); AstNode *base_type = nullptr; if (f->curr_token.kind != Token_OpenBrace) { - base_type = parse_type(f); + if (f->curr_token.kind != Token_Hash) { + base_type = parse_type(f); + } + while (allow_token(f, Token_Hash)) { + Token tag = f->curr_token; + if (f->curr_token.kind != Token_Ident && f->curr_token.kind != Token_export) { + expect_token_after(f, Token_Ident, "#"); + } else { + tag = advance_token(f); + } + if (tag.string == "export") { + if (is_export) { + syntax_error(tag, "Duplicate enum tag '#%.*s'", LIT(tag.string)); + } + is_export = true; + } else { + syntax_error(tag, "Invalid enum tag '#%.*s'", LIT(tag.string)); + } + } } Token open = expect_token(f, Token_OpenBrace); Array values = parse_element_list(f); Token close = expect_token(f, Token_CloseBrace); - return ast_enum_type(f, token, base_type, values); + return ast_enum_type(f, token, base_type, is_export, values); } break; case Token_bit_field: { -- cgit v1.2.3