From b2f703417a3cff2d750ef948e70fb0f268ba8ac6 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sun, 8 Jun 2014 10:05:03 +0100 Subject: [PATCH] Parsing enumeration literals --- src/parse.c | 39 +++++++++++++++++++++++++++++++++++++++ test/test_parse.c | 2 +- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/parse.c b/src/parse.c index 9ba4e9ba8..6cbd38b94 100644 --- a/src/parse.c +++ b/src/parse.c @@ -1679,6 +1679,41 @@ static type_t p_physical_type_definition(range_t r) return t; } +static tree_t p_enumeration_literal(void) +{ + // identifier | character_literal + + BEGIN("enumeration literal"); + + tree_t t = tree_new(T_ENUM_LIT); + tree_set_ident(t, p_identifier()); + tree_set_loc(t, CURRENT_LOC); + + return t; +} + +static type_t p_enumeration_type_definition(void) +{ + // ( enumeration_literal { , enumeration_literal } ) + + BEGIN("enumeration type definition"); + + type_t t = type_new(T_ENUM); + + consume(tLPAREN); + + unsigned pos = 0; + do { + tree_t lit = p_enumeration_literal(); + tree_set_pos(lit, pos++); + type_enum_add_literal(t, lit); + } while (optional(tCOMMA)); + + consume(tRPAREN); + + return t; +} + static type_t p_scalar_type_definition(void) { // enumeration_type_definition | integer_type_definition @@ -1706,6 +1741,9 @@ static type_t p_scalar_type_definition(void) } } + case tLPAREN: + return p_enumeration_type_definition(); + default: expect(tRANGE); return type_new(T_NONE); @@ -1816,6 +1854,7 @@ static type_t p_type_definition(void) switch (peek()) { case tRANGE: + case tLPAREN: return p_scalar_type_definition(); case tACCESS: diff --git a/test/test_parse.c b/test/test_parse.c index 99889766f..46e923913 100644 --- a/test/test_parse.c +++ b/test/test_parse.c @@ -1867,8 +1867,8 @@ int main(void) tcase_add_test(tc_core, test_literal); tcase_add_test(tc_core, test_extended); tcase_add_test(tc_core, test_package); -#if 0 tcase_add_test(tc_core, test_enum); +#if 0 tcase_add_test(tc_core, test_qual); tcase_add_test(tc_core, test_func); tcase_add_test(tc_core, test_array);