2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-01 19:04:29 +04:00
|
|
|
module AST.Parser (example, contract) where
|
2020-04-30 17:58:35 +04:00
|
|
|
|
|
|
|
import Data.Text (Text)
|
|
|
|
|
2020-05-06 21:26:00 +04:00
|
|
|
import AST.Types hiding (tuple)
|
2020-04-30 17:58:35 +04:00
|
|
|
|
|
|
|
import Parser
|
|
|
|
import Range
|
|
|
|
|
|
|
|
import Debug.Trace
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
name :: Parser (Name ASTInfo)
|
2020-05-06 21:59:34 +04:00
|
|
|
name = ctor Name <*> token "Name"
|
2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
capitalName :: Parser (Name ASTInfo)
|
2020-05-06 21:59:34 +04:00
|
|
|
capitalName = ctor Name <*> token "Name_Capital"
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
contract :: Parser (Contract ASTInfo)
|
2020-05-06 21:59:34 +04:00
|
|
|
contract =
|
|
|
|
ctor Contract
|
|
|
|
<*> subtree "contract" do
|
|
|
|
many "declaration" do
|
|
|
|
inside "declaration:" do
|
|
|
|
declaration
|
2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
declaration :: Parser (Declaration ASTInfo)
|
2020-05-06 21:59:34 +04:00
|
|
|
declaration
|
|
|
|
= do ctor ValueDecl <*> binding
|
|
|
|
<|> do ctor ValueDecl <*> vardecl
|
|
|
|
<|> do ctor ValueDecl <*> constdecl
|
|
|
|
<|> typedecl
|
2020-05-06 23:19:28 +04:00
|
|
|
<|> do ctor Action <*> attributes
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
typedecl :: Parser (Declaration ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
typedecl = do
|
|
|
|
subtree "type_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor TypeDecl
|
|
|
|
<*> inside "typeName:" name
|
|
|
|
<*> inside "typeValue:" newtype_
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
vardecl :: Parser (Binding ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
vardecl = do
|
|
|
|
subtree "var_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Var
|
|
|
|
<*> inside "name:" name
|
|
|
|
<*> inside "type:" type_
|
|
|
|
<*> inside "value:" expr
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
constdecl :: Parser (Binding ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
constdecl = do
|
|
|
|
subtree "const_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Const
|
|
|
|
<*> inside "name" name
|
|
|
|
<*> inside "type" type_
|
|
|
|
<*> inside "value" expr
|
2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
binding :: Parser (Binding ASTInfo)
|
2020-04-30 17:58:35 +04:00
|
|
|
binding = do
|
2020-05-06 21:26:00 +04:00
|
|
|
inside ":fun_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Function
|
|
|
|
<*> recursive
|
|
|
|
<*> inside "name:" name
|
|
|
|
<*> inside "parameters:parameters" do
|
|
|
|
many "param" do
|
|
|
|
notFollowedBy do
|
|
|
|
consumeOrDie ")"
|
|
|
|
|
|
|
|
stubbed "parameters" paramDecl
|
|
|
|
<*> inside "type:" type_
|
|
|
|
<*> inside "body:" letExpr
|
|
|
|
|
|
|
|
recursive = do
|
|
|
|
mr <- optional do
|
|
|
|
inside "recursive" do
|
|
|
|
token "recursie"
|
|
|
|
|
|
|
|
return $ maybe False (== "recursive") mr
|
2020-04-30 21:46:37 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
expr :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
expr = stubbed "expr" do
|
|
|
|
select
|
2020-05-06 22:15:19 +04:00
|
|
|
[ ctor Ident <*> do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor QualifiedName
|
|
|
|
<*> name
|
|
|
|
<*> pure []
|
2020-05-06 21:26:00 +04:00
|
|
|
, opCall
|
|
|
|
, fun_call
|
|
|
|
, record_expr
|
|
|
|
, int_literal
|
2020-05-06 22:45:33 +04:00
|
|
|
, tez_literal
|
2020-05-06 21:26:00 +04:00
|
|
|
, par_call
|
|
|
|
, method_call
|
2020-05-06 22:45:33 +04:00
|
|
|
, if_expr
|
|
|
|
, assign
|
|
|
|
, list_expr
|
|
|
|
, has_type
|
|
|
|
, string_literal
|
2020-05-06 23:19:28 +04:00
|
|
|
, attributes
|
2020-05-07 00:31:05 +04:00
|
|
|
, tuple_expr
|
|
|
|
, moduleQualified
|
|
|
|
, big_map_expr
|
|
|
|
, map_expr
|
|
|
|
, map_remove
|
2020-05-06 21:26:00 +04:00
|
|
|
-- , constant
|
|
|
|
]
|
2020-05-01 22:41:07 +04:00
|
|
|
where
|
|
|
|
-- $.case_expr,
|
|
|
|
-- $.cond_expr,
|
|
|
|
-- $.disj_expr,
|
|
|
|
-- $.fun_expr,
|
|
|
|
|
2020-05-07 00:31:05 +04:00
|
|
|
map_remove :: Parser (Expr ASTInfo)
|
|
|
|
map_remove = do
|
|
|
|
subtree "map_remove" do
|
|
|
|
ctor MapRemove
|
|
|
|
<*> inside "key" expr
|
|
|
|
<*> inside "container" do
|
|
|
|
inside ":path" do
|
|
|
|
qname
|
|
|
|
|
|
|
|
big_map_expr :: Parser (Expr ASTInfo)
|
|
|
|
big_map_expr = do
|
|
|
|
subtree "big_map_injection" do
|
|
|
|
ctor BigMap <*> do
|
|
|
|
many "binding" do
|
|
|
|
inside "binding" do
|
|
|
|
map_binding
|
|
|
|
|
|
|
|
map_expr :: Parser (Expr ASTInfo)
|
|
|
|
map_expr = do
|
|
|
|
subtree "map_injection" do
|
|
|
|
ctor Map <*> do
|
|
|
|
many "binding" do
|
|
|
|
inside "binding" do
|
|
|
|
map_binding
|
|
|
|
|
|
|
|
map_binding :: Parser (MapBinding ASTInfo)
|
|
|
|
map_binding = do
|
|
|
|
subtree "binding" do
|
|
|
|
ctor MapBinding
|
|
|
|
<*> inside "key" expr
|
|
|
|
<*> inside "value" expr
|
|
|
|
|
|
|
|
moduleQualified :: Parser (Expr ASTInfo)
|
|
|
|
moduleQualified = do
|
|
|
|
subtree "module_field" do
|
|
|
|
ctor Ident <*> do
|
|
|
|
ctor QualifiedName
|
|
|
|
<*> inside "module" capitalName
|
|
|
|
<*> do pure <$> do ctor At <*> inside "method" name
|
|
|
|
|
|
|
|
tuple_expr :: Parser (Expr ASTInfo)
|
|
|
|
tuple_expr = do
|
|
|
|
subtree "tuple_expr" do
|
|
|
|
ctor Tuple <*> do
|
|
|
|
many "tuple element" do
|
|
|
|
inside "element" expr
|
|
|
|
|
2020-05-06 23:19:28 +04:00
|
|
|
attributes :: Parser (Expr ASTInfo)
|
|
|
|
attributes = do
|
|
|
|
subtree "attr_decl" do
|
|
|
|
ctor Attrs <*> do
|
|
|
|
many "attribute" do
|
|
|
|
inside "attribute" do
|
|
|
|
token "String"
|
|
|
|
|
2020-05-06 22:45:33 +04:00
|
|
|
string_literal :: Parser (Expr ASTInfo)
|
|
|
|
string_literal = do
|
|
|
|
ctor Constant <*> do
|
|
|
|
ctor String <*>
|
|
|
|
token "String"
|
|
|
|
|
|
|
|
has_type :: Parser (Expr ASTInfo)
|
|
|
|
has_type = do
|
|
|
|
subtree "annot_expr" do
|
|
|
|
ctor Annot
|
|
|
|
<*> inside "subject" expr
|
|
|
|
<*> inside "type" type_
|
|
|
|
|
|
|
|
list_expr :: Parser (Expr ASTInfo)
|
|
|
|
list_expr = do
|
|
|
|
subtree "list_expr" do
|
|
|
|
ctor List <*> do
|
|
|
|
many "list elem" do
|
|
|
|
inside "element" expr
|
|
|
|
|
|
|
|
qname :: Parser (QualifiedName ASTInfo)
|
|
|
|
qname = do
|
|
|
|
ctor QualifiedName
|
|
|
|
<*> name
|
|
|
|
<*> pure []
|
|
|
|
|
|
|
|
assign :: Parser (Expr ASTInfo)
|
|
|
|
assign = do
|
|
|
|
subtree "assignment" do
|
|
|
|
ctor Assign
|
2020-05-07 00:31:05 +04:00
|
|
|
<*> inside "LHS" lhs
|
2020-05-06 22:45:33 +04:00
|
|
|
<*> inside "RHS" expr
|
|
|
|
|
2020-05-07 00:31:05 +04:00
|
|
|
lhs :: Parser (LHS ASTInfo)
|
|
|
|
lhs =
|
|
|
|
do ctor LHS
|
|
|
|
<*> inside "container:path" do
|
|
|
|
qname <|> projection
|
|
|
|
<*> pure Nothing
|
|
|
|
<|>
|
|
|
|
do ctor LHS
|
|
|
|
<*> subtree "path" do
|
|
|
|
qname <|> projection
|
|
|
|
<*> pure Nothing
|
|
|
|
<|>
|
|
|
|
do subtree "map_lookup" do
|
|
|
|
ctor LHS
|
|
|
|
<*> inside "container:path" do
|
|
|
|
qname <|> projection
|
|
|
|
<*> inside "index" do
|
|
|
|
Just <$> expr
|
|
|
|
|
|
|
|
|
2020-05-06 22:45:33 +04:00
|
|
|
tez_literal :: Parser (Expr ASTInfo)
|
|
|
|
tez_literal = do
|
|
|
|
ctor Constant <*> do
|
|
|
|
ctor Tez <*> token "Tez"
|
|
|
|
|
|
|
|
if_expr :: Parser (Expr ASTInfo)
|
|
|
|
if_expr = do
|
|
|
|
subtree "conditional" do
|
|
|
|
ctor If
|
|
|
|
<*> inside "selector" expr
|
|
|
|
<*> inside "then:if_clause" expr
|
|
|
|
<*> inside "else:if_clause" expr
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
method_call :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
method_call = do
|
|
|
|
subtree "projection_call" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Apply
|
|
|
|
<*> do ctor Ident <*> field "f" projection
|
|
|
|
<*> inside "arguments" arguments
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
projection :: Parser (QualifiedName ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
projection = do
|
2020-05-07 00:31:05 +04:00
|
|
|
gets pfGrove >>= traceShowM
|
2020-05-06 21:26:00 +04:00
|
|
|
subtree "data_projection" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor QualifiedName
|
|
|
|
<*> inside "struct" name
|
|
|
|
<*> many "selection" selection
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
selection :: Parser (Path ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
selection = do
|
2020-05-07 00:31:05 +04:00
|
|
|
inside "index:selection"
|
|
|
|
$ do ctor At <*> name
|
|
|
|
<|> do ctor Ix <*> token "Int"
|
|
|
|
<|>
|
|
|
|
inside "index" do
|
|
|
|
do ctor Ix <*> token "Int"
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
par_call :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
par_call = do
|
|
|
|
subtree "par_call" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Apply
|
|
|
|
<*> inside "f" expr
|
|
|
|
<*> inside "arguments" arguments
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
int_literal :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
int_literal = do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Constant
|
|
|
|
<*> do ctor Int <*> token "Int"
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
record_expr :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
record_expr = do
|
|
|
|
subtree "record_expr" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Record <*> do
|
|
|
|
many "assignment" do
|
|
|
|
inside "assignment:field_assignment" do
|
|
|
|
ctor Assignment
|
|
|
|
<*> inside "name" name
|
|
|
|
<*> inside "_rhs" expr
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
fun_call :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
fun_call = do
|
|
|
|
subtree "fun_call" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Apply
|
|
|
|
<*> do ctor Ident <*> inside "f" function_id
|
|
|
|
<*> inside "arguments" arguments
|
2020-05-06 21:26:00 +04:00
|
|
|
|
|
|
|
arguments =
|
|
|
|
subtree "arguments" do
|
|
|
|
many "argument" do
|
|
|
|
inside "argument" expr
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
function_id :: Parser (QualifiedName ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
function_id = select
|
2020-05-06 22:45:33 +04:00
|
|
|
[ qname
|
2020-05-06 21:26:00 +04:00
|
|
|
, do
|
|
|
|
subtree "module_field" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor QualifiedName
|
|
|
|
<*> inside "module" capitalName
|
|
|
|
<*> do pure <$> do ctor At <*> inside "method" name
|
2020-05-06 21:26:00 +04:00
|
|
|
]
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
opCall :: Parser (Expr ASTInfo)
|
2020-05-06 21:26:00 +04:00
|
|
|
opCall = do
|
2020-05-06 21:59:34 +04:00
|
|
|
subtree "op_expr"
|
|
|
|
$ do inside "the" expr
|
|
|
|
<|> do ctor BinOp
|
|
|
|
<*> inside "arg1" expr
|
|
|
|
<*> inside "op" anything
|
|
|
|
<*> inside "arg2" expr
|
2020-05-06 23:19:28 +04:00
|
|
|
<|> do ctor UnOp
|
|
|
|
<*> inside "negate" anything
|
|
|
|
<*> inside "arg" expr
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-01 22:41:07 +04:00
|
|
|
letExpr = do
|
|
|
|
subtree "let_expr" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor let'
|
|
|
|
<*> optional do
|
|
|
|
inside "locals:block" do
|
|
|
|
many "decl" do
|
|
|
|
inside "statement" do
|
|
|
|
declaration <|> statement
|
|
|
|
<*> inside "body"expr
|
|
|
|
|
|
|
|
where
|
|
|
|
let' r decls body = case decls of
|
2020-05-01 22:41:07 +04:00
|
|
|
Just them -> Let r them body
|
|
|
|
Nothing -> body
|
2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
statement :: Parser (Declaration ASTInfo)
|
2020-05-06 21:59:34 +04:00
|
|
|
statement = ctor Action <*> expr
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
paramDecl :: Parser (VarDecl ASTInfo)
|
2020-04-30 17:58:35 +04:00
|
|
|
paramDecl = do
|
|
|
|
info <- getRange
|
2020-05-06 21:26:00 +04:00
|
|
|
inside "parameter:param_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor Decl
|
|
|
|
<*> do inside ":access" do
|
|
|
|
select
|
|
|
|
[ ctor Mutable <* consumeOrDie "var"
|
|
|
|
, ctor Immutable <* consumeOrDie "const"
|
|
|
|
]
|
|
|
|
<*> inside "name" name
|
|
|
|
<*> inside "type" type_
|
2020-05-06 21:26:00 +04:00
|
|
|
|
|
|
|
newtype_ = select
|
|
|
|
[ record_type
|
|
|
|
, type_
|
|
|
|
-- , sum_type
|
|
|
|
]
|
|
|
|
|
|
|
|
record_type = do
|
|
|
|
subtree "record_type" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor TRecord
|
|
|
|
<*> many "field" do
|
|
|
|
inside "field" do
|
|
|
|
field_decl
|
2020-05-06 21:26:00 +04:00
|
|
|
|
|
|
|
field_decl = do
|
|
|
|
subtree "field_decl" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor TField
|
|
|
|
<*> inside "fieldName" name
|
|
|
|
<*> inside "fieldType" type_
|
2020-04-30 17:58:35 +04:00
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
type_ :: Parser (Type ASTInfo)
|
2020-04-30 17:58:35 +04:00
|
|
|
type_ =
|
|
|
|
fun_type
|
|
|
|
where
|
2020-05-06 22:15:19 +04:00
|
|
|
fun_type :: Parser (Type ASTInfo)
|
2020-04-30 17:58:35 +04:00
|
|
|
fun_type = do
|
2020-05-06 21:26:00 +04:00
|
|
|
inside ":fun_type" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor tarrow
|
|
|
|
<*> inside "domain" cartesian
|
|
|
|
<*> optional do inside "codomain" fun_type
|
2020-05-06 21:26:00 +04:00
|
|
|
|
2020-05-06 21:59:34 +04:00
|
|
|
where
|
|
|
|
tarrow info domain codomain =
|
|
|
|
case codomain of
|
|
|
|
Just co -> TArrow info domain co
|
|
|
|
Nothing -> domain
|
2020-04-30 17:58:35 +04:00
|
|
|
|
|
|
|
cartesian = do
|
2020-05-06 21:26:00 +04:00
|
|
|
inside ":cartesian" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor TProduct <*> some "corety" do
|
2020-05-06 21:26:00 +04:00
|
|
|
inside "element" do
|
|
|
|
core_type
|
2020-04-30 17:58:35 +04:00
|
|
|
|
|
|
|
core_type = do
|
|
|
|
select
|
2020-05-06 21:59:34 +04:00
|
|
|
[ ctor TVar <*> name
|
2020-05-06 21:26:00 +04:00
|
|
|
, subtree "invokeBinary" do
|
2020-05-06 21:59:34 +04:00
|
|
|
ctor TApply
|
2020-05-07 00:31:05 +04:00
|
|
|
<*> inside "typeConstr" name'
|
2020-05-06 21:59:34 +04:00
|
|
|
<*> inside "arguments" typeTuple
|
2020-05-06 22:45:33 +04:00
|
|
|
, subtree "invokeUnary" do
|
|
|
|
ctor TApply
|
|
|
|
<*> inside "typeConstr" name'
|
|
|
|
<*> do pure <$> inside "arguments" type_
|
2020-04-30 17:58:35 +04:00
|
|
|
]
|
|
|
|
|
2020-05-06 22:45:33 +04:00
|
|
|
name' :: Parser (Name ASTInfo)
|
|
|
|
name' = do
|
|
|
|
ctor Name <*> anything
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
typeTuple :: Parser [Type ASTInfo]
|
2020-05-06 21:26:00 +04:00
|
|
|
typeTuple = do
|
|
|
|
subtree "type_tuple" do
|
|
|
|
many "type tuple element" do
|
|
|
|
inside "element" type_
|
|
|
|
|
2020-05-06 22:15:19 +04:00
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
2020-05-06 21:26:00 +04:00
|
|
|
-- example = "../../../src/test/contracts/address.ligo"
|
2020-05-06 22:45:33 +04:00
|
|
|
-- example = "../../../src/test/contracts/amount.ligo"
|
2020-05-06 23:19:28 +04:00
|
|
|
-- example = "../../../src/test/contracts/annotation.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/arithmetic.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/assign.ligo"
|
2020-05-07 00:31:05 +04:00
|
|
|
-- example = "../../../src/test/contracts/attributes.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/bad_timestamp.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/bad_type_operator.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/balance_constant.ligo"
|
|
|
|
example = "../../../src/test/contracts/big_map.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|
2020-05-06 21:26:00 +04:00
|
|
|
-- example = "../../../src/test/contracts/application.ligo"
|