Declarations can now be written in any order. Removed top-level block.

The parser exports now an entry rule for parsing Ligo expressions.
This commit is contained in:
Christian Rinderknecht 2019-03-11 12:51:50 +01:00
parent 8746802571
commit 29df2ff9aa
No known key found for this signature in database
GPG Key ID: 9446816CFD267040
5 changed files with 48 additions and 49 deletions

35
AST.ml
View File

@ -143,17 +143,19 @@ type 'a braces = (lbrace * 'a * rbrace) reg
(* The Abstract Syntax Tree *) (* The Abstract Syntax Tree *)
type t = { type t = {
types : type_decl reg list; decl : declaration nseq;
constants : const_decl reg list; eof : eof
storage : storage_decl reg;
operations : operations_decl reg;
lambdas : lambda_decl list;
block : block reg;
eof : eof
} }
and ast = t 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 = { and const_decl = {
kwd_const : kwd_const; kwd_const : kwd_const;
name : variable; name : variable;
@ -566,15 +568,16 @@ let print_int {region; value = lexeme, abstract} =
(* Main printing function *) (* Main printing function *)
let rec print_tokens ast = let rec print_tokens ast =
let {types; constants; storage; operations; let {decl; eof} = ast in
lambdas; block; eof} = ast in Utils.nseq_iter print_decl decl;
List.iter print_type_decl types; print_token eof "EOF"
List.iter print_const_decl constants;
print_storage_decl storage; and print_decl = function
print_operations_decl operations; TypeDecl decl -> print_type_decl decl
List.iter print_lambda_decl lambdas; | ConstDecl decl -> print_const_decl decl
print_block block; | StorageDecl decl -> print_storage_decl decl
print_token eof "EOF" | OpDecl decl -> print_operations_decl decl
| LambdaDecl decl -> print_lambda_decl decl
and print_const_decl {value; _} = and print_const_decl {value; _} =
let {kwd_const; name; colon; const_type; let {kwd_const; name; colon; const_type;

16
AST.mli
View File

@ -127,17 +127,19 @@ type 'a braces = (lbrace * 'a * rbrace) reg
(* The Abstract Syntax Tree *) (* The Abstract Syntax Tree *)
type t = { type t = {
types : type_decl reg list; decl : declaration nseq;
constants : const_decl reg list; eof : eof
storage : storage_decl reg;
operations : operations_decl reg;
lambdas : lambda_decl list;
block : block reg;
eof : eof
} }
and ast = t 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 = { and const_decl = {
kwd_const : kwd_const; kwd_const : kwd_const;
name : variable; name : variable;

View File

@ -13,8 +13,9 @@ open AST
(* Entry points *) (* Entry points *)
%start program %start program interactive_expr
%type <AST.t> program %type <AST.t> program
%type <AST.expr> interactive_expr
%% %%
@ -89,24 +90,17 @@ sepseq(X,Sep):
(* Main *) (* Main *)
program: program:
seq(type_decl) nseq(declaration) EOF {
seq(const_decl) {decl = $1; eof = $2}
storage_decl
operations_decl
seq(lambda_decl)
block
EOF {
{
types = $1;
constants = $2;
storage = $3;
operations = $4;
lambdas = $5;
block = $6;
eof = $7;
}
} }
declaration:
type_decl { TypeDecl $1 }
| const_decl { ConstDecl $1 }
| storage_decl { StorageDecl $1 }
| operations_decl { OpDecl $1 }
| lambda_decl { LambdaDecl $1 }
storage_decl: storage_decl:
Storage var COLON type_expr option(SEMI) { Storage var COLON type_expr option(SEMI) {
let stop = let stop =
@ -485,6 +479,9 @@ arrow_clause:
(* Expressions *) (* Expressions *)
interactive_expr:
expr EOF { $1 }
expr: expr:
expr OR conj_expr { expr OR conj_expr {
let start = expr_to_region $1 let start = expr_to_region $1

View File

@ -69,7 +69,3 @@ let () =
let () = close_all () in let () = close_all () in
print_error ~offsets EvalOpt.mode error print_error ~offsets EvalOpt.mode error
| Sys_error msg -> Utils.highlight msg | Sys_error msg -> Utils.highlight msg
let _ =
let open AST2 in
map

View File

@ -6,6 +6,8 @@ type w is K of (U of int) (*v * u*)
storage s : w // Line comment storage s : w // Line comment
operations o : u; operations o : u;
type i is int;
(* Block comment *) (* Block comment *)
entrypoint g (const l : list (int)) is entrypoint g (const l : list (int)) is
@ -19,10 +21,9 @@ entrypoint g (const l : list (int)) is
match l with match l with
[] -> null [] -> null
| h#t -> q (h+2) | h#t -> q (h+2)
end;
begin
g (Unit);
fail "in extremis"
end end
end end
begin
g (Unit);
fail "in extremis"
end