Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** Parsing command-line options *)
|
2019-07-24 15:41:52 +02:00
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** The type [command] denotes some possible behaviours of the
|
|
|
|
compiler.
|
|
|
|
*)
|
2019-07-24 15:41:52 +02:00
|
|
|
type command = Quiet | Copy | Units | Tokens
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** The type [options] gathers the command-line options.
|
|
|
|
*)
|
|
|
|
type options = <
|
2019-07-24 15:41:52 +02:00
|
|
|
input : string option;
|
|
|
|
libs : string list;
|
|
|
|
verbose : Utils.String.Set.t;
|
|
|
|
offsets : bool;
|
|
|
|
mode : [`Byte | `Point];
|
2019-12-20 16:44:03 +01:00
|
|
|
cmd : command;
|
|
|
|
mono : bool
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
>
|
|
|
|
|
2019-12-20 16:44:03 +01:00
|
|
|
let make ~input ~libs ~verbose ~offsets ~mode ~cmd ~mono =
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
object
|
|
|
|
method input = input
|
|
|
|
method libs = libs
|
|
|
|
method verbose = verbose
|
|
|
|
method offsets = offsets
|
|
|
|
method mode = mode
|
|
|
|
method cmd = cmd
|
2019-12-20 16:44:03 +01:00
|
|
|
method mono = mono
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
end
|
2019-07-24 15:41:52 +02:00
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** {1 Auxiliary functions} *)
|
2019-05-12 20:56:22 +00:00
|
|
|
|
|
|
|
let printf = Printf.printf
|
|
|
|
let sprintf = Printf.sprintf
|
2019-07-24 15:41:52 +02:00
|
|
|
let print = print_endline
|
2019-05-12 20:56:22 +00:00
|
|
|
|
|
|
|
let abort msg =
|
|
|
|
Utils.highlight (sprintf "Command-line error: %s\n" msg); exit 1
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** {1 Help} *)
|
2019-05-12 20:56:22 +00:00
|
|
|
|
2019-09-27 13:33:25 +00:00
|
|
|
let help language extension () =
|
2019-05-12 20:56:22 +00:00
|
|
|
let file = Filename.basename Sys.argv.(0) in
|
2019-09-27 13:33:25 +00:00
|
|
|
printf "Usage: %s [<option> ...] [<input>%s | \"-\"]\n" file extension;
|
|
|
|
printf "where <input>%s is the %s source file (default: stdin)," extension language;
|
2019-07-24 15:41:52 +02:00
|
|
|
print "and each <option> (if any) is one of the following:";
|
|
|
|
print " -I <paths> Library paths (colon-separated)";
|
|
|
|
print " -c, --copy Print lexemes of tokens and markup (lexer)";
|
|
|
|
print " -t, --tokens Print tokens (lexer)";
|
|
|
|
print " -u, --units Print tokens and markup (lexer)";
|
|
|
|
print " -q, --quiet No output, except errors (default)";
|
|
|
|
print " --columns Columns for source locations";
|
|
|
|
print " --bytes Bytes for source locations";
|
2019-12-20 16:44:03 +01:00
|
|
|
print " --mono Use Menhir monolithic API";
|
2019-10-15 21:03:46 +02:00
|
|
|
print " --verbose=<stages> cmdline, cpp, ast-tokens, ast (colon-separated)";
|
2019-07-24 15:41:52 +02:00
|
|
|
print " --version Commit hash on stdout";
|
|
|
|
print " -h, --help This help";
|
2019-05-12 20:56:22 +00:00
|
|
|
exit 0
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** {1 Version} *)
|
2019-05-12 20:56:22 +00:00
|
|
|
|
|
|
|
let version () = printf "%s\n" Version.version; exit 0
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** {1 Specifying the command-line options a la GNU} *)
|
2019-05-12 20:56:22 +00:00
|
|
|
|
2019-07-24 15:41:52 +02:00
|
|
|
let copy = ref false
|
|
|
|
and tokens = ref false
|
|
|
|
and units = ref false
|
|
|
|
and quiet = ref false
|
|
|
|
and columns = ref false
|
|
|
|
and bytes = ref false
|
|
|
|
and verbose = ref Utils.String.Set.empty
|
|
|
|
and input = ref None
|
|
|
|
and libs = ref []
|
|
|
|
and verb_str = ref ""
|
2019-12-20 16:44:03 +01:00
|
|
|
and mono = ref false
|
2019-05-12 20:56:22 +00:00
|
|
|
|
|
|
|
let split_at_colon = Str.(split (regexp ":"))
|
|
|
|
|
|
|
|
let add_path p = libs := !libs @ split_at_colon p
|
|
|
|
|
|
|
|
let add_verbose d =
|
|
|
|
verbose := List.fold_left (Utils.swap Utils.String.Set.add)
|
|
|
|
!verbose
|
|
|
|
(split_at_colon d)
|
|
|
|
|
2019-09-27 13:33:25 +00:00
|
|
|
let specs language extension =
|
2019-05-12 20:56:22 +00:00
|
|
|
let open! Getopt in [
|
|
|
|
'I', nolong, None, Some add_path;
|
|
|
|
'c', "copy", set copy true, None;
|
|
|
|
't', "tokens", set tokens true, None;
|
|
|
|
'u', "units", set units true, None;
|
|
|
|
'q', "quiet", set quiet true, None;
|
|
|
|
noshort, "columns", set columns true, None;
|
|
|
|
noshort, "bytes", set bytes true, None;
|
2019-12-20 16:44:03 +01:00
|
|
|
noshort, "mono", set mono true, None;
|
2019-05-12 20:56:22 +00:00
|
|
|
noshort, "verbose", None, Some add_verbose;
|
2019-09-27 13:33:25 +00:00
|
|
|
'h', "help", Some (help language extension), None;
|
2019-05-12 20:56:22 +00:00
|
|
|
noshort, "version", Some version, None
|
|
|
|
]
|
|
|
|
;;
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** Handler of anonymous arguments
|
|
|
|
*)
|
2019-05-12 20:56:22 +00:00
|
|
|
let anonymous arg =
|
|
|
|
match !input with
|
|
|
|
None -> input := Some arg
|
2019-07-24 15:41:52 +02:00
|
|
|
| Some s -> Printf.printf "s=%s\n" s;
|
|
|
|
abort (sprintf "Multiple inputs")
|
2019-05-12 20:56:22 +00:00
|
|
|
;;
|
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** Checking options and exporting them as non-mutable values
|
|
|
|
*)
|
2019-05-12 20:56:22 +00:00
|
|
|
let string_of convert = function
|
|
|
|
None -> "None"
|
|
|
|
| Some s -> sprintf "Some %s" (convert s)
|
|
|
|
|
|
|
|
let string_of_path p =
|
|
|
|
let apply s a = if a = "" then s else s ^ ":" ^ a
|
|
|
|
in List.fold_right apply p ""
|
|
|
|
|
|
|
|
let quote s = sprintf "\"%s\"" s
|
|
|
|
|
|
|
|
let print_opt () =
|
|
|
|
printf "COMMAND LINE\n";
|
|
|
|
printf "copy = %b\n" !copy;
|
|
|
|
printf "tokens = %b\n" !tokens;
|
|
|
|
printf "units = %b\n" !units;
|
|
|
|
printf "quiet = %b\n" !quiet;
|
|
|
|
printf "columns = %b\n" !columns;
|
|
|
|
printf "bytes = %b\n" !bytes;
|
2019-12-20 16:44:03 +01:00
|
|
|
printf "mono = %b\b" !mono;
|
2019-07-24 15:41:52 +02:00
|
|
|
printf "verbose = %s\n" !verb_str;
|
2019-05-12 20:56:22 +00:00
|
|
|
printf "input = %s\n" (string_of quote !input);
|
|
|
|
printf "libs = %s\n" (string_of_path !libs)
|
|
|
|
;;
|
|
|
|
|
2019-09-27 13:33:25 +00:00
|
|
|
let check extension =
|
2019-07-24 15:41:52 +02:00
|
|
|
let () =
|
|
|
|
if Utils.String.Set.mem "cmdline" !verbose then print_opt () in
|
|
|
|
|
|
|
|
let input =
|
|
|
|
match !input with
|
|
|
|
None | Some "-" -> !input
|
|
|
|
| Some file_path ->
|
2019-09-27 13:33:25 +00:00
|
|
|
if Filename.check_suffix file_path extension
|
2019-07-24 15:41:52 +02:00
|
|
|
then if Sys.file_exists file_path
|
|
|
|
then Some file_path
|
|
|
|
else abort "Source file not found."
|
2019-09-27 13:33:25 +00:00
|
|
|
else abort ("Source file lacks the extension " ^ extension ^ ".") in
|
2019-07-24 15:41:52 +02:00
|
|
|
|
|
|
|
(* Exporting remaining options as non-mutable values *)
|
|
|
|
|
|
|
|
let copy = !copy
|
|
|
|
and tokens = !tokens
|
|
|
|
and units = !units
|
|
|
|
and quiet = !quiet
|
|
|
|
and offsets = not !columns
|
|
|
|
and mode = if !bytes then `Byte else `Point
|
2019-12-20 16:44:03 +01:00
|
|
|
and mono = !mono
|
2019-07-24 15:41:52 +02:00
|
|
|
and verbose = !verbose
|
|
|
|
and libs = !libs in
|
|
|
|
|
|
|
|
let () =
|
|
|
|
if Utils.String.Set.mem "cmdline" verbose then
|
|
|
|
begin
|
|
|
|
printf "\nEXPORTED COMMAND LINE\n";
|
|
|
|
printf "copy = %b\n" copy;
|
|
|
|
printf "tokens = %b\n" tokens;
|
|
|
|
printf "units = %b\n" units;
|
|
|
|
printf "quiet = %b\n" quiet;
|
|
|
|
printf "offsets = %b\n" offsets;
|
|
|
|
printf "mode = %s\n" (if mode = `Byte then "`Byte" else "`Point");
|
2019-12-20 16:44:03 +01:00
|
|
|
printf "mono = %b\n" mono;
|
2019-07-24 15:41:52 +02:00
|
|
|
printf "verbose = %s\n" !verb_str;
|
|
|
|
printf "input = %s\n" (string_of quote input);
|
|
|
|
printf "libs = %s\n" (string_of_path libs)
|
|
|
|
end in
|
|
|
|
|
|
|
|
let cmd =
|
|
|
|
match quiet, copy, units, tokens with
|
|
|
|
false, false, false, false
|
|
|
|
| true, false, false, false -> Quiet
|
|
|
|
| false, true, false, false -> Copy
|
|
|
|
| false, false, true, false -> Units
|
|
|
|
| false, false, false, true -> Tokens
|
|
|
|
| _ -> abort "Choose one of -q, -c, -u, -t."
|
|
|
|
|
2019-12-20 16:44:03 +01:00
|
|
|
in make ~input ~libs ~verbose ~offsets ~mode ~cmd ~mono
|
2019-05-12 20:56:22 +00:00
|
|
|
|
Refactoring of comments (for [dune build @doc]).
Refactoring of parsing command-line arguments
* The type [options] is now abstract and implemented as an
object type to avoid struggling with scoping and type
inference when record types share some common field names.
Refactoring of ParserLog for PascaLIGO and CameLIGO
* The immediate motivation behind that refactoring was to
remove the use of a couple of global references. A
consequence is that we have a nicer and more compact code, by
threading a state. The files [pascaligo/Tests/pp.ligo] and
[ligodity/Tests/pp.mligo].
* Another consequence is that the choice of making strings from
AST nodes depends on the CLI (offsets? mode?). After this
refactoring, that choice is hardcoded in the simplifiers in a
few places (TODO), waiting for a general solution that would
have all CL options flow through the compiler.
* I removed the use of vendors [x_option.ml], [x_map.ml] and
[x_list.ml] when handling optional values. (Less dependencies
this way.)
Refactoring of the ASTs
* I removed the node [local_decl], which was set to [[]]
already in a previous commit (which removed local
declarations as being redundant, as statements could already
be instructions or declarations).
* I changed [StrLit] to [String] in the AST of CameLIGO and
ReasonLIGO.
* I also changed the type [fun_expr] so now either a block is
present, and therefore followed by the [with] keyword, or it
is not. (Before, the presence of a block was not enforced in
the type with the presence of the keyword.)
Notes
* [LexerMain.ml] and [ParserMain.ml] for CameLIGO and PascaLIGO
are almost identical and differ in the same way (language
name and file extension), which suggests that they should be
in the [shared] folder and instanciated as a functor in the
future (TODO).
* I removed the blank characters at the end of many lines in
the parser of ReasonLIGO.
2019-12-13 12:21:52 +01:00
|
|
|
(** {1 Parsing the command-line options} *)
|
2019-05-12 20:56:22 +00:00
|
|
|
|
2019-09-27 13:33:25 +00:00
|
|
|
let read language extension =
|
2019-07-24 15:41:52 +02:00
|
|
|
try
|
2019-10-07 16:33:34 +02:00
|
|
|
Getopt.parse_cmdline (specs language extension) anonymous;
|
2019-07-24 15:41:52 +02:00
|
|
|
(verb_str :=
|
|
|
|
let apply e a =
|
|
|
|
if a <> "" then Printf.sprintf "%s, %s" e a else e
|
|
|
|
in Utils.String.Set.fold apply !verbose "");
|
2019-09-27 13:33:25 +00:00
|
|
|
check extension
|
2019-07-24 15:41:52 +02:00
|
|
|
with Getopt.Error msg -> abort msg
|