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

31
AST.ml
View File

@ -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;
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,16 +568,17 @@ 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;
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;
equal; init; terminator} = value in

14
AST.mli
View File

@ -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;
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;

View File

@ -13,8 +13,9 @@ open AST
(* Entry points *)
%start program
%start program interactive_expr
%type <AST.t> program
%type <AST.expr> 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

View File

@ -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

View File

@ -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
end
begin
end;
begin
g (Unit);
fail "in extremis"
end
end
end