From 29df2ff9aa941eeccf4e11df9e9c05fda1152364 Mon Sep 17 00:00:00 2001 From: Christian Rinderknecht Date: Mon, 11 Mar 2019 12:51:50 +0100 Subject: [PATCH] Declarations can now be written in any order. Removed top-level block. The parser exports now an entry rule for parsing Ligo expressions. --- AST.ml | 35 +++++++++++++++++++---------------- AST.mli | 16 +++++++++------- Parser.mly | 31 ++++++++++++++----------------- ParserMain.ml | 4 ---- Tests/a.li | 11 ++++++----- 5 files changed, 48 insertions(+), 49 deletions(-) diff --git a/AST.ml b/AST.ml index 61d510be5..914950944 100644 --- a/AST.ml +++ b/AST.ml @@ -143,17 +143,19 @@ type 'a braces = (lbrace * 'a * rbrace) reg (* The Abstract Syntax Tree *) type t = { - types : type_decl reg list; - constants : const_decl reg list; - storage : storage_decl reg; - operations : operations_decl reg; - lambdas : lambda_decl list; - block : block reg; - eof : eof + decl : declaration nseq; + eof : eof } and ast = t +and declaration = + TypeDecl of type_decl reg +| ConstDecl of const_decl reg +| StorageDecl of storage_decl reg +| OpDecl of operations_decl reg +| LambdaDecl of lambda_decl + and const_decl = { kwd_const : kwd_const; name : variable; @@ -566,15 +568,16 @@ let print_int {region; value = lexeme, abstract} = (* Main printing function *) let rec print_tokens ast = - let {types; constants; storage; operations; - lambdas; block; eof} = ast in - List.iter print_type_decl types; - List.iter print_const_decl constants; - print_storage_decl storage; - print_operations_decl operations; - List.iter print_lambda_decl lambdas; - print_block block; - print_token eof "EOF" + let {decl; eof} = ast in + Utils.nseq_iter print_decl decl; + print_token eof "EOF" + +and print_decl = function + TypeDecl decl -> print_type_decl decl +| ConstDecl decl -> print_const_decl decl +| StorageDecl decl -> print_storage_decl decl +| OpDecl decl -> print_operations_decl decl +| LambdaDecl decl -> print_lambda_decl decl and print_const_decl {value; _} = let {kwd_const; name; colon; const_type; diff --git a/AST.mli b/AST.mli index 62bca0ec5..1b2611d93 100644 --- a/AST.mli +++ b/AST.mli @@ -127,17 +127,19 @@ type 'a braces = (lbrace * 'a * rbrace) reg (* The Abstract Syntax Tree *) type t = { - types : type_decl reg list; - constants : const_decl reg list; - storage : storage_decl reg; - operations : operations_decl reg; - lambdas : lambda_decl list; - block : block reg; - eof : eof + decl : declaration nseq; + eof : eof } and ast = t +and declaration = + TypeDecl of type_decl reg +| ConstDecl of const_decl reg +| StorageDecl of storage_decl reg +| OpDecl of operations_decl reg +| LambdaDecl of lambda_decl + and const_decl = { kwd_const : kwd_const; name : variable; diff --git a/Parser.mly b/Parser.mly index 2d56948b2..33be06e17 100644 --- a/Parser.mly +++ b/Parser.mly @@ -13,8 +13,9 @@ open AST (* Entry points *) -%start program +%start program interactive_expr %type program +%type interactive_expr %% @@ -89,24 +90,17 @@ sepseq(X,Sep): (* Main *) program: - seq(type_decl) - seq(const_decl) - storage_decl - operations_decl - seq(lambda_decl) - block - EOF { - { - types = $1; - constants = $2; - storage = $3; - operations = $4; - lambdas = $5; - block = $6; - eof = $7; - } + nseq(declaration) EOF { + {decl = $1; eof = $2} } +declaration: + type_decl { TypeDecl $1 } +| const_decl { ConstDecl $1 } +| storage_decl { StorageDecl $1 } +| operations_decl { OpDecl $1 } +| lambda_decl { LambdaDecl $1 } + storage_decl: Storage var COLON type_expr option(SEMI) { let stop = @@ -485,6 +479,9 @@ arrow_clause: (* Expressions *) +interactive_expr: + expr EOF { $1 } + expr: expr OR conj_expr { let start = expr_to_region $1 diff --git a/ParserMain.ml b/ParserMain.ml index 917a56517..7644a6769 100644 --- a/ParserMain.ml +++ b/ParserMain.ml @@ -69,7 +69,3 @@ let () = let () = close_all () in print_error ~offsets EvalOpt.mode error | Sys_error msg -> Utils.highlight msg - -let _ = - let open AST2 in - map diff --git a/Tests/a.li b/Tests/a.li index a5456ee9e..9ab4b3399 100644 --- a/Tests/a.li +++ b/Tests/a.li @@ -6,6 +6,8 @@ type w is K of (U of int) (*v * u*) storage s : w // Line comment operations o : u; +type i is int; + (* Block comment *) entrypoint g (const l : list (int)) is @@ -19,10 +21,9 @@ entrypoint g (const l : list (int)) is match l with [] -> null | h#t -> q (h+2) + end; + begin + g (Unit); + fail "in extremis" end end - -begin - g (Unit); - fail "in extremis" -end