From 212534976a825994630959bf5f281305c39ca270 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Wed, 17 Nov 2021 16:03:56 +0200 Subject: [PATCH] Add polymorphism to syntax tree and parser --- src/aeso_parser.erl | 24 ++++++++++++++++++------ src/aeso_syntax.erl | 6 +++--- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/aeso_parser.erl b/src/aeso_parser.erl index 7e5fa62..7877367 100644 --- a/src/aeso_parser.erl +++ b/src/aeso_parser.erl @@ -96,17 +96,29 @@ decl() -> choice( %% Contract declaration [ ?RULE(token(main), keyword(contract), - con(), tok('='), maybe_block(decl()), {contract_main, _2, _3, _5}) + con(), tok('='), maybe_block(decl()), {contract_main, _2, _3, [], _5}) + , ?RULE(token(main), keyword(contract), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), {contract_main, _2, _3, _5, _7}) , ?RULE(keyword(contract), - con(), tok('='), maybe_block(decl()), {contract_child, _1, _2, _4}) + con(), tok('='), maybe_block(decl()), {contract_child, _1, _2, [], _4}) + , ?RULE(keyword(contract), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), {contract_child, _1, _2, _4, _6}) , ?RULE(keyword(contract), token(interface), - con(), tok('='), maybe_block(decl()), {contract_interface, _1, _3, _5}) + con(), tok('='), maybe_block(decl()), {contract_interface, _1, _3, [], _5}) + , ?RULE(keyword(contract), token(interface), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), {contract_interface, _1, _3, _5, _7}) , ?RULE(token(payable), token(main), keyword(contract), - con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_main, _3, _4, _6})) + con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_main, _3, _4, [], _6})) + , ?RULE(token(payable), token(main), keyword(contract), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_main, _3, _4, _6, _8})) , ?RULE(token(payable), keyword(contract), - con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_child, _2, _3, _5})) + con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_child, _2, _3, [], _5})) + , ?RULE(token(payable), keyword(contract), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_child, _2, _3, _5, _7})) , ?RULE(token(payable), keyword(contract), token(interface), - con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_interface, _2, _4, _6})) + con(), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_interface, _2, _4, [], _6})) + , ?RULE(token(payable), keyword(contract), token(interface), + con(), tok(':'), comma_sep(con()), tok('='), maybe_block(decl()), add_modifiers([_1], {contract_interface, _2, _4, _6, _8})) , ?RULE(keyword(namespace), con(), tok('='), maybe_block(decl()), {namespace, _1, _2, _4}) diff --git a/src/aeso_syntax.erl b/src/aeso_syntax.erl index 1e01153..fbf4a6b 100644 --- a/src/aeso_syntax.erl +++ b/src/aeso_syntax.erl @@ -38,9 +38,9 @@ -type namespace_alias() :: none | con(). -type namespace_parts() :: none | {for, [id()]} | {hiding, [id()]}. --type decl() :: {contract_main, ann(), con(), [decl()]} - | {contract_child, ann(), con(), [decl()]} - | {contract_interface, ann(), con(), [decl()]} +-type decl() :: {contract_main, ann(), con(), [con()], [decl()]} + | {contract_child, ann(), con(), [con()], [decl()]} + | {contract_interface, ann(), con(), [con()], [decl()]} | {namespace, ann(), con(), [decl()]} | {pragma, ann(), pragma()} | {type_decl, ann(), id(), [tvar()]} % Only for error msgs