From aca086e5e73d5463e4590b35d22890b9d86076de Mon Sep 17 00:00:00 2001 From: Galfour Date: Fri, 5 Apr 2019 15:37:37 +0000 Subject: [PATCH] multifix + restructure --- src/ligo/dune | 6 +- src/ligo/ligo-helpers/dune | 8 - src/ligo/ligo-helpers/ligo-helpers.opam | 22 - src/ligo/ligo-parser/ligo-parser.opam | 19 - src/ligo/ligo.opam | 2 - src/ligo/{ligo-helpers => ligo_helpers}/PP.ml | 0 .../dictionary.ml | 0 .../dictionary.mli | 0 src/ligo/ligo_helpers/dune | 9 + .../environment.ml | 0 .../location.ml | 0 .../{ligo-helpers => ligo_helpers}/option.ml | 0 .../{ligo-helpers => ligo_helpers}/trace.ml | 0 .../{ligo-helpers => ligo_helpers}/tree.ml | 0 .../{ligo-helpers => ligo_helpers}/wrap.ml | 0 .../{ligo-helpers => ligo_helpers}/x_map.ml | 0 src/ligo/ligo_multifix/ast.ml | 19 + src/ligo/ligo_multifix/dune | 63 ++ src/ligo/ligo_multifix/foo.test | 1 + src/ligo/ligo_multifix/generator.ml | 323 +++++++ src/ligo/ligo_multifix/lex/dune | 24 + src/ligo/ligo_multifix/lex/lexer.ml | 410 ++++++++ src/ligo/ligo_multifix/lex/lexer.mll | 39 + src/ligo/ligo_multifix/lex/token.ml | 18 + src/ligo/ligo_multifix/lex/token.mly | 9 + src/ligo/ligo_multifix/lex/token_type.ml | 17 + src/ligo/ligo_multifix/lex/token_type.mli | 19 + src/ligo/ligo_multifix/lexer.mll | 39 + src/ligo/ligo_multifix/location.ml | 31 + src/ligo/ligo_multifix/parser.ml | 874 ++++++++++++++++++ src/ligo/ligo_multifix/parser.mli | 12 + src/ligo/ligo_multifix/parser.mly | 99 ++ src/ligo/ligo_multifix/partial_parser.mly | 70 ++ src/ligo/ligo_multifix/pre_parser.mly | 29 + src/ligo/ligo_multifix/token.mly | 9 + src/ligo/ligo_multifix/user.ml | 10 + .../.Lexer.ml.tag | 0 .../.LexerMain.tag | 0 .../.Parser.mly.tag | 0 .../.ParserMain.tag | 0 .../{ligo-parser => ligo_parser}/.gitignore | 0 .../.gitlab-ci.yml | 0 src/ligo/{ligo-parser => ligo_parser}/.links | 0 src/ligo/{ligo-parser => ligo_parser}/AST.ml | 0 src/ligo/{ligo-parser => ligo_parser}/AST.mli | 0 .../{ligo-parser => ligo_parser}/Error.mli | 0 .../{ligo-parser => ligo_parser}/EvalOpt.ml | 0 .../{ligo-parser => ligo_parser}/EvalOpt.mli | 0 .../{ligo-parser => ligo_parser}/FQueue.ml | 0 .../{ligo-parser => ligo_parser}/FQueue.mli | 0 .../{ligo-parser => ligo_parser}/LexToken.mli | 0 .../{ligo-parser => ligo_parser}/LexToken.mll | 0 .../{ligo-parser => ligo_parser}/Lexer.mli | 0 .../{ligo-parser => ligo_parser}/Lexer.mll | 0 .../{ligo-parser => ligo_parser}/LexerMain.ml | 0 .../{ligo-parser => ligo_parser}/Markup.ml | 0 .../{ligo-parser => ligo_parser}/Markup.mli | 0 .../{ligo-parser => ligo_parser}/ParToken.mly | 0 .../{ligo-parser => ligo_parser}/Parser.mly | 0 .../ParserMain.ml | 0 src/ligo/{ligo-parser => ligo_parser}/Pos.ml | 0 src/ligo/{ligo-parser => ligo_parser}/Pos.mli | 0 .../{ligo-parser => ligo_parser}/Region.ml | 0 .../{ligo-parser => ligo_parser}/Region.mli | 0 .../{ligo-parser => ligo_parser}/Tests/a.ligo | 0 .../Tests/crowdfunding.ligo | 0 .../{ligo-parser => ligo_parser}/Utils.ml | 0 .../{ligo-parser => ligo_parser}/Utils.mli | 0 .../check_dot_git_is_dir.sh | 0 src/ligo/{ligo-parser => ligo_parser}/dune | 2 +- .../ligo_parser.ml | 0 src/ligo/{ => rope}/rope.ml | 0 src/ligo/{ => rope}/rope.mli | 0 src/ligo/{ => rope}/rope_implementation.ml | 0 src/ligo/{ => rope}/rope_implementation.mli | 0 src/ligo/{ => rope}/rope_test.ml | 0 src/ligo/{ => rope}/rope_top_level_open.ml | 0 src/ligo/{ => rope}/rope_top_level_open.mli | 0 78 files changed, 2128 insertions(+), 55 deletions(-) delete mode 100644 src/ligo/ligo-helpers/dune delete mode 100644 src/ligo/ligo-helpers/ligo-helpers.opam delete mode 100644 src/ligo/ligo-parser/ligo-parser.opam rename src/ligo/{ligo-helpers => ligo_helpers}/PP.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/dictionary.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/dictionary.mli (100%) create mode 100644 src/ligo/ligo_helpers/dune rename src/ligo/{ligo-helpers => ligo_helpers}/environment.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/location.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/option.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/trace.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/tree.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/wrap.ml (100%) rename src/ligo/{ligo-helpers => ligo_helpers}/x_map.ml (100%) create mode 100644 src/ligo/ligo_multifix/ast.ml create mode 100644 src/ligo/ligo_multifix/dune create mode 100644 src/ligo/ligo_multifix/foo.test create mode 100644 src/ligo/ligo_multifix/generator.ml create mode 100644 src/ligo/ligo_multifix/lex/dune create mode 100644 src/ligo/ligo_multifix/lex/lexer.ml create mode 100644 src/ligo/ligo_multifix/lex/lexer.mll create mode 100644 src/ligo/ligo_multifix/lex/token.ml create mode 100644 src/ligo/ligo_multifix/lex/token.mly create mode 100644 src/ligo/ligo_multifix/lex/token_type.ml create mode 100644 src/ligo/ligo_multifix/lex/token_type.mli create mode 100644 src/ligo/ligo_multifix/lexer.mll create mode 100644 src/ligo/ligo_multifix/location.ml create mode 100644 src/ligo/ligo_multifix/parser.ml create mode 100644 src/ligo/ligo_multifix/parser.mli create mode 100644 src/ligo/ligo_multifix/parser.mly create mode 100644 src/ligo/ligo_multifix/partial_parser.mly create mode 100644 src/ligo/ligo_multifix/pre_parser.mly create mode 100644 src/ligo/ligo_multifix/token.mly create mode 100644 src/ligo/ligo_multifix/user.ml rename src/ligo/{ligo-parser => ligo_parser}/.Lexer.ml.tag (100%) rename src/ligo/{ligo-parser => ligo_parser}/.LexerMain.tag (100%) rename src/ligo/{ligo-parser => ligo_parser}/.Parser.mly.tag (100%) rename src/ligo/{ligo-parser => ligo_parser}/.ParserMain.tag (100%) rename src/ligo/{ligo-parser => ligo_parser}/.gitignore (100%) rename src/ligo/{ligo-parser => ligo_parser}/.gitlab-ci.yml (100%) rename src/ligo/{ligo-parser => ligo_parser}/.links (100%) rename src/ligo/{ligo-parser => ligo_parser}/AST.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/AST.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/Error.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/EvalOpt.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/EvalOpt.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/FQueue.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/FQueue.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/LexToken.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/LexToken.mll (100%) rename src/ligo/{ligo-parser => ligo_parser}/Lexer.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/Lexer.mll (100%) rename src/ligo/{ligo-parser => ligo_parser}/LexerMain.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Markup.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Markup.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/ParToken.mly (100%) rename src/ligo/{ligo-parser => ligo_parser}/Parser.mly (100%) rename src/ligo/{ligo-parser => ligo_parser}/ParserMain.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Pos.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Pos.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/Region.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Region.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/Tests/a.ligo (100%) rename src/ligo/{ligo-parser => ligo_parser}/Tests/crowdfunding.ligo (100%) rename src/ligo/{ligo-parser => ligo_parser}/Utils.ml (100%) rename src/ligo/{ligo-parser => ligo_parser}/Utils.mli (100%) rename src/ligo/{ligo-parser => ligo_parser}/check_dot_git_is_dir.sh (100%) rename src/ligo/{ligo-parser => ligo_parser}/dune (97%) rename src/ligo/{ligo-parser => ligo_parser}/ligo_parser.ml (100%) rename src/ligo/{ => rope}/rope.ml (100%) rename src/ligo/{ => rope}/rope.mli (100%) rename src/ligo/{ => rope}/rope_implementation.ml (100%) rename src/ligo/{ => rope}/rope_implementation.mli (100%) rename src/ligo/{ => rope}/rope_test.ml (100%) rename src/ligo/{ => rope}/rope_top_level_open.ml (100%) rename src/ligo/{ => rope}/rope_top_level_open.mli (100%) diff --git a/src/ligo/dune b/src/ligo/dune index df889af1b..0b1ed73ac 100644 --- a/src/ligo/dune +++ b/src/ligo/dune @@ -5,8 +5,9 @@ tezos-utils tezos-micheline meta-michelson - ligo-helpers - ligo-parser + ligo_helpers + ligo_parser + multifix ) (preprocess (pps ppx_let) @@ -18,5 +19,4 @@ (name runtest) (action (run test/test.exe)) (deps (glob_files contracts/*)) - ) diff --git a/src/ligo/ligo-helpers/dune b/src/ligo/ligo-helpers/dune deleted file mode 100644 index f3d586dbf..000000000 --- a/src/ligo/ligo-helpers/dune +++ /dev/null @@ -1,8 +0,0 @@ -(library - (libraries - tezos-base - tezos-utils - ) - (name ligo_helpers) - (public_name ligo-helpers) -) diff --git a/src/ligo/ligo-helpers/ligo-helpers.opam b/src/ligo/ligo-helpers/ligo-helpers.opam deleted file mode 100644 index 8a47a95ff..000000000 --- a/src/ligo/ligo-helpers/ligo-helpers.opam +++ /dev/null @@ -1,22 +0,0 @@ -name: "ligo-helpers" -opam-version: "2.0" -version: "1.0" -maintainer: "gabriel.alfour@gmail.com" -authors: [ "Galfour" ] -homepage: "https://gitlab.com/gabriel.alfour/tezos" -bug-reports: "https://gitlab.com/gabriel.alfour/tezos/issues" -dev-repo: "git+https://gitlab.com/gabriel.alfour/tezos.git" -license: "MIT" -depends: [ - "ocamlfind" { build } - "dune" { build & >= "1.0.1" } - "meta-michelson" - "tezos-utils" - "tezos-base" -] -build: [ - [ "dune" "build" "-p" name "-j" jobs ] -] -url { - src: "https://gitlab.com/gabriel.alfour/tezos/-/archive/master/tezos.tar.gz" -} diff --git a/src/ligo/ligo-parser/ligo-parser.opam b/src/ligo/ligo-parser/ligo-parser.opam deleted file mode 100644 index cf73a592f..000000000 --- a/src/ligo/ligo-parser/ligo-parser.opam +++ /dev/null @@ -1,19 +0,0 @@ -opam-version : "2.0" -version : "1.0" -maintainer : "gabriel.alfour@gmail.com" -authors : [ "Galfour" ] -homepage : "https://gitlab.com/gabriel.alfour/ligo-parser" -bug-reports : "https://gitlab.com/gabriel.alfour/ligo-parser/issues" -dev-repo : "git+https://gitlab.com/gabriel.alfour/ligo-parser.git" -license : "MIT" - -depends : [ "dune" "menhir" "hex" "zarith" "getopt" "uutf" ] - -build : [ - [ "sh" "-c" "printf 'let version = \"%s\"' \"$(git describe --always --dirty --abbrev=0)\" > Version.ml" ] - [ "dune" "build" "-p" name "-j" jobs ] - ] - -url { - src: "https://gitlab.com/gabriel.alfour/ligo-parser/-/archive/master/ligo-parser.tar.gz" -} diff --git a/src/ligo/ligo.opam b/src/ligo/ligo.opam index 5cc61a43c..459ced958 100644 --- a/src/ligo/ligo.opam +++ b/src/ligo/ligo.opam @@ -13,8 +13,6 @@ depends: [ "ppx_let" "tezos-utils" "meta-michelson" - "ligo-helpers" - "ligo-parser" ] build: [ [ "dune" "build" "-p" name "-j" jobs ] diff --git a/src/ligo/ligo-helpers/PP.ml b/src/ligo/ligo_helpers/PP.ml similarity index 100% rename from src/ligo/ligo-helpers/PP.ml rename to src/ligo/ligo_helpers/PP.ml diff --git a/src/ligo/ligo-helpers/dictionary.ml b/src/ligo/ligo_helpers/dictionary.ml similarity index 100% rename from src/ligo/ligo-helpers/dictionary.ml rename to src/ligo/ligo_helpers/dictionary.ml diff --git a/src/ligo/ligo-helpers/dictionary.mli b/src/ligo/ligo_helpers/dictionary.mli similarity index 100% rename from src/ligo/ligo-helpers/dictionary.mli rename to src/ligo/ligo_helpers/dictionary.mli diff --git a/src/ligo/ligo_helpers/dune b/src/ligo/ligo_helpers/dune new file mode 100644 index 000000000..d74f31409 --- /dev/null +++ b/src/ligo/ligo_helpers/dune @@ -0,0 +1,9 @@ +(library + (name ligo_helpers) + (public_name ligo.helpers) + (libraries + tezos-base + tezos-utils + ) +;; (modules x_map option wrap tree location environment dictionary PP trace) +) diff --git a/src/ligo/ligo-helpers/environment.ml b/src/ligo/ligo_helpers/environment.ml similarity index 100% rename from src/ligo/ligo-helpers/environment.ml rename to src/ligo/ligo_helpers/environment.ml diff --git a/src/ligo/ligo-helpers/location.ml b/src/ligo/ligo_helpers/location.ml similarity index 100% rename from src/ligo/ligo-helpers/location.ml rename to src/ligo/ligo_helpers/location.ml diff --git a/src/ligo/ligo-helpers/option.ml b/src/ligo/ligo_helpers/option.ml similarity index 100% rename from src/ligo/ligo-helpers/option.ml rename to src/ligo/ligo_helpers/option.ml diff --git a/src/ligo/ligo-helpers/trace.ml b/src/ligo/ligo_helpers/trace.ml similarity index 100% rename from src/ligo/ligo-helpers/trace.ml rename to src/ligo/ligo_helpers/trace.ml diff --git a/src/ligo/ligo-helpers/tree.ml b/src/ligo/ligo_helpers/tree.ml similarity index 100% rename from src/ligo/ligo-helpers/tree.ml rename to src/ligo/ligo_helpers/tree.ml diff --git a/src/ligo/ligo-helpers/wrap.ml b/src/ligo/ligo_helpers/wrap.ml similarity index 100% rename from src/ligo/ligo-helpers/wrap.ml rename to src/ligo/ligo_helpers/wrap.ml diff --git a/src/ligo/ligo-helpers/x_map.ml b/src/ligo/ligo_helpers/x_map.ml similarity index 100% rename from src/ligo/ligo-helpers/x_map.ml rename to src/ligo/ligo_helpers/x_map.ml diff --git a/src/ligo/ligo_multifix/ast.ml b/src/ligo/ligo_multifix/ast.ml new file mode 100644 index 000000000..c28731cba --- /dev/null +++ b/src/ligo/ligo_multifix/ast.ml @@ -0,0 +1,19 @@ +(* AST *) +(* Language *) + + (* Singletons *) +type variable = string + + (* Hierarchies *) +type arith = +| Let_in of (variable Location.wrap * arith Location.wrap * arith Location.wrap) +| Addition of (arith Location.wrap * arith Location.wrap) +| Substraction of (arith Location.wrap * arith Location.wrap) +| Multiplication of (arith Location.wrap * arith Location.wrap) +| Division of (arith Location.wrap * arith Location.wrap) +| List of ((arith Location.wrap list)) +| Arith_variable of (variable Location.wrap) + (* Entry point *) +type entry_point = arith + + diff --git a/src/ligo/ligo_multifix/dune b/src/ligo/ligo_multifix/dune new file mode 100644 index 000000000..22e47f863 --- /dev/null +++ b/src/ligo/ligo_multifix/dune @@ -0,0 +1,63 @@ +(library + (name multifix) + (public_name ligo.multifix) + (libraries lex) + (modules ast parser location user) +) + +;; Generating parser + +(rule + (targets parser.ml parser.mli) + (deps parser.mly ast.ml) + (action (system "menhir --external-tokens Lex.Token lex/token.mly parser.mly --base parser")) + (mode promote-until-clean) +) + +(rule + (targets parser.mly) + (deps partial_parser.mly pre_parser.mly) + (action (system "cat pre_parser.mly partial_parser.mly > parser.mly")) + (mode promote-until-clean) +) + +(rule + (targets partial_parser.mly) + (deps generator.exe) + (action (system "./generator.exe parser > partial_parser.mly")) + (mode promote-until-clean) +) + +;; Generating AST + +(rule + (targets ast.ml) + (deps generator.exe) + (action (system "./generator.exe ast > ast.ml")) + (mode promote-until-clean) +) + +;; Generating Generator + +(executable + (name generator) + (libraries + ocamlgraph + lex + ) + (modules generator) +) + +;; Tests + +(alias + (name test-user) + (deps user.exe foo.test) + (action (system "./user.exe foo.test")) +) + +(alias + (name runtest) + (deps generator.exe) + (action (system "./generator.exe parser ; ./generator.exe ast")) +) diff --git a/src/ligo/ligo_multifix/foo.test b/src/ligo/ligo_multifix/foo.test new file mode 100644 index 000000000..debde1b01 --- /dev/null +++ b/src/ligo/ligo_multifix/foo.test @@ -0,0 +1 @@ +let toto = at * bo in list [ toto ; tata ; titi ] diff --git a/src/ligo/ligo_multifix/generator.ml b/src/ligo/ligo_multifix/generator.ml new file mode 100644 index 000000000..4831be254 --- /dev/null +++ b/src/ligo/ligo_multifix/generator.ml @@ -0,0 +1,323 @@ +module N = struct + type 'a t = { + content : 'a ; + name : string ; + } + + let name name content = { name ; content } + let destruct {name ; content} = (name, content) + let get_name x = x.name + let get_content x = x.content +end + +let list_filter_map f = + let rec aux acc lst = match lst with + | [] -> List.rev acc + | hd :: tl -> aux ( + match f hd with + | Some x -> x :: acc + | None -> acc + ) tl + in + aux [] + +module Ne_list = struct + type 'a t = 'a * 'a list + + let of_list lst = List.(hd lst, tl lst) + let iter f (hd, tl : _ t) = f hd ; List.iter f tl + let map f (hd, tl : _ t) = f hd, List.map f tl + let mapi f (hd, tl : _ t) = + let lst = List.mapi f (hd::tl) in + of_list lst + let concat (hd, tl : _ t) = hd @ List.concat tl + let rev (hd, tl : _ t) = + match tl with + | [] -> (hd, []) + | lst -> + let r = List.rev lst in + (List.hd r, List.tl r @ [hd]) +end + +module PP = struct + open Format + let string : formatter -> string -> unit = fun ppf s -> fprintf ppf "%s" s + let tag tag : formatter -> unit -> unit = fun ppf () -> fprintf ppf tag + let new_line : formatter -> unit -> unit = tag "@;" + let rec new_lines n ppf () = + match n with + | 0 -> new_line ppf () + | n -> new_line ppf () ; new_lines (n-1) ppf () + let const const : formatter -> unit -> unit = fun ppf () -> fprintf ppf "%s" const + let comment : formatter -> string -> unit = fun ppf s -> fprintf ppf "(* %s *)" s + let list_sep value separator = pp_print_list ~pp_sep:separator value + let ne_list_sep value separator ppf (hd, tl) = + value ppf hd ; + separator ppf () ; + pp_print_list ~pp_sep:separator value ppf tl +end + +module Token = Lex.Token +type token = Token.token + +module O = struct + + type element = + | Named of string (* Named rule, like type_var *) + | Token of token + | List of ([`Trail | `Lead | `Separator] * token * token * token) + | Current + | Lower (* Lower precedence *) + + type operator = element list + type n_operator = operator N.t + + type n_operators = n_operator list + type level = n_operators N.t + + type hierarchy = level Ne_list.t + type n_hierarchy = hierarchy N.t + + type singleton = { + type_name : string ; + type_expression : string ; + menhir_rule : string ; + menhir_code : string ; + } + + type language = { + entry_point : string ; + singletons : singleton list ; + hierarchies : n_hierarchy list ; + } + + let get_op : n_operator -> operator = N.get_content + + let singleton type_name type_expression menhir_rule menhir_code = + {type_name ; type_expression ; menhir_rule ; menhir_code} + let language entry_point singletons hierarchies = {entry_point ; singletons ; hierarchies} + + let name_hierarchy name : n_operators list -> n_hierarchy = fun nopss -> + let nopss' = Ne_list.of_list nopss in + let name_i = fun i x -> N.name (name ^ "_" ^ (string_of_int i)) x in + let levels : hierarchy = Ne_list.mapi name_i nopss' in + N.name name levels + +end + +module Check = struct + open O + + let well_formed : language -> unit = fun l -> + let elements : element list -> unit = fun es -> + let rec aux = fun es -> + match es with + | [] -> () + | [ _ ] -> () + | (List _ | Named _ | Current | Lower) :: (List _ | Named _ | Current | Lower) :: _ -> + raise (Failure "two non-token separated ops in a row") + | _ :: tl -> aux tl + in + (if (List.length es < 2) then raise (Failure "operator is too short")) ; + aux es in + let op : n_operator -> unit = fun x -> elements @@ N.get_content x in + let level : level -> unit = fun l -> List.iter op @@ N.get_content l in + let hierarchy : n_hierarchy -> unit = fun h -> Ne_list.iter level @@ N.get_content h in + List.iter hierarchy l.hierarchies + + let associativity : language -> unit = fun l -> + let level : level -> unit = fun l -> + let aux : ([`Left | `Right | `None] as 'a) -> n_operator -> 'a = fun ass nop -> + let op = N.get_content nop in + match ass, List.hd op, List.nth op (List.length op - 1) with + | _, Lower, Lower -> raise (Failure "double assoc") + | `None, Lower, _ -> `Left + | `None, _, Lower -> `Right + | `Left, _, Lower -> raise (Failure "different assocs") + | `Right, Lower, _ -> raise (Failure "different assocs") + | m, _, _ -> m + in + let _assert = List.fold_left aux `None (N.get_content l) in + () + in + let hierarchy : n_hierarchy -> unit = fun h -> + Ne_list.iter level (N.get_content h) in + List.iter hierarchy l.hierarchies + +end + + +module Print_AST = struct + open Format + + let singleton : _ -> O.singleton -> _ = fun ppf s -> + fprintf ppf "type %s = %s" s.type_name s.type_expression + + let n_operator level_name : _ -> O.n_operator -> _ = fun ppf nop -> + let type_elements = + let aux : O.element -> string option = fun e -> + match e with + | Named s -> Some (s ^ " Location.wrap") + | List _ -> Some ("(" ^ level_name ^ " Location.wrap list)") + | Token _ -> None + | Current | Lower -> Some (level_name ^ " Location.wrap") in + list_filter_map aux (N.get_content nop) in + let type_element = fun ppf te -> fprintf ppf "%s" te in + fprintf ppf "| %s of (%a)" + (N.get_name nop) + PP.(list_sep type_element (const " * ")) type_elements + + let n_hierarchy : _ -> O.n_hierarchy -> _ = fun ppf nh -> + let levels = Ne_list.map N.get_content (N.get_content nh) in + let nops = Ne_list.concat levels in + let name = N.get_name nh in + fprintf ppf "type %s =@.@[%a@]" + name + PP.(list_sep (n_operator name) new_line) nops + + let language : _ -> O.language -> _ = fun ppf l -> + fprintf ppf "%a@.@." PP.comment "Language" ; + fprintf ppf " %a@.%a@.@." PP.comment "Singletons" PP.(list_sep singleton new_line) l.singletons ; + fprintf ppf " %a@.%a@." PP.comment "Hierarchies" PP.(list_sep n_hierarchy (new_lines 2)) l.hierarchies ; + fprintf ppf " %a@.type entry_point = %s@.@." PP.comment "Entry point" l.entry_point ; + () +end + +module Print_Grammar = struct + open Format + + let singleton : _ -> O.singleton -> _ = fun ppf s -> + fprintf ppf "%s : %s@. @[{@; @[let loc = Location.make $startpos $endpos in@;Location.wrap ~loc %s@]@;}@;@]" + s.type_name s.menhir_rule s.menhir_code + + let letters = [| "a" ; "b" ; "c" ; "d" ; "e" ; "f" ; "g" ; "h" ; "i" ; "j" |] + + let n_operator_rule prev_lvl_name cur_lvl_name : _ -> O.n_operator -> _ = fun ppf nop -> + let i = ref 0 in + let element : _ -> O.element -> _ = fun ppf element -> + (match element with + | Token t -> i := !i - 1 ; PP.string ppf @@ Token.to_string t + | List (mode, beg, sep, end_) -> + fprintf ppf "%s %s = %s(%s, %s) %s" + (Token.to_string beg) + letters.(!i) + (match mode with | `Lead -> "lead_list" | `Trail -> "trail_list" | `Separator -> "separated_list") + (Token.to_string sep) + cur_lvl_name + (Token.to_string end_) + | Named n -> + fprintf ppf "%s = %s" letters.(!i) n + | Current -> + fprintf ppf "%s = %s" letters.(!i) cur_lvl_name + | Lower -> + fprintf ppf "%s = %s" letters.(!i) prev_lvl_name + ) ; + i := !i + 1 + in + PP.(list_sep element (const " ")) ppf (N.get_content nop) + + let n_operator_code : _ -> O.n_operator -> _ = fun ppf nop -> + let (name, elements) = N.destruct nop in + let elements' = + let i = ref 0 in + let aux : O.element -> _ = fun e -> + let r = + match e with + | Token _ -> i := !i - 1 ; None + | List _ | Named _ | Current | Lower -> Some letters.(!i) + in i := !i + 1 ; r + in + list_filter_map aux elements in + fprintf ppf "%s (%a)" name PP.(list_sep string (const " , ")) elements' + + let n_operator prev_lvl_name cur_lvl_name : _ -> O.n_operator -> _ = fun ppf nop -> + let name = N.get_name nop in + fprintf ppf "%a@;| %a@; @[{@; @[let loc = Location.make $startpos $endpos in@;Location.wrap ~loc %@%@ %a@]@;}@]" PP.comment name + (n_operator_rule prev_lvl_name cur_lvl_name) nop + n_operator_code nop + + let level prev_lvl_name : _ -> O.level -> _ = fun ppf l -> + let name = N.get_name l in + match prev_lvl_name with + | "" -> ( + fprintf ppf "%s :@. @[%a@]" name + PP.(list_sep (n_operator prev_lvl_name name) new_line) (N.get_content l) ; + ) + | _ -> ( + fprintf ppf "%s :@. @[%a@;| %s { $1 }@]" name + PP.(list_sep (n_operator prev_lvl_name name) new_line) (N.get_content l) + prev_lvl_name + ) + + let n_hierarchy : _ -> O.n_hierarchy -> _ = fun ppf nh -> + let name = N.get_name nh in + fprintf ppf "%a@.%%inline %s : %s_0 { $1 }@.@;" PP.comment ("Top-level for " ^ name) name name; + let (hd, tl) = Ne_list.rev @@ N.get_content nh in + fprintf ppf "%a" (level "") hd ; + let aux prev_name lvl = + PP.new_lines 2 ppf () ; + fprintf ppf "%a" (level prev_name) lvl ; + N.get_name lvl + in + let _last_name = List.fold_left aux (N.get_name hd) tl in + () + + let language : _ -> O.language -> _ = fun ppf l -> + fprintf ppf "%a@.@." PP.comment "Generated Language" ; + fprintf ppf "entry_point : %s EOF { $1 }@.@." l.entry_point ; + fprintf ppf "%a@.@." PP.comment "Singletons" ; + fprintf ppf "@[%a@]@.@." (PP.list_sep singleton PP.new_line) l.singletons ; + fprintf ppf "%a@.@." PP.comment "Hierarchies" ; + fprintf ppf "@[%a@]" (PP.list_sep n_hierarchy PP.new_line) l.hierarchies ; + +end + +let variable = O.singleton "variable" "string" "NAME" "$1" + +let infix : string -> [`Left | `Right] -> token -> O.n_operator = fun name assoc t -> + let open O in + match assoc with + | `Left -> N.name name [Current ; Token t ; Lower] + | `Right -> N.name name [Current ; Token t ; Lower] + +let list = N.name "List" [ + O.Token Token.LIST ; List (`Lead, Token.LSQUARE, Token.SEMICOLON, Token.RSQUARE) ; +] + +let let_in : O.n_operator = N.name "Let_in" [ + O.Token Token.LET ; Named "variable" ; + O.Token Token.EQUAL ; Current ; + O.Token Token.IN ; Current ; +] + +let addition = infix "Addition" `Left Token.PLUS +let substraction = infix "Substraction" `Left Token.MINUS + +let multiplication = infix "Multiplication" `Left Token.TIMES +let division = infix "Division" `Left Token.DIV + +let arith_variable : O.n_operator = N.name "Arith_variable" [ O.Named "variable" ] + +let arith = O.name_hierarchy "arith" [ + [let_in] ; + [addition ; substraction] ; + [multiplication ; division] ; + [list] ; + [arith_variable] ; +] + +let language = O.language "arith" [variable] [arith] + +let () = + let argn = Array.length Sys.argv in + if argn = 1 then exit 1 ; + let arg = Sys.argv.(1) in + match arg with + | "parser" -> ( + Format.printf "%a@.%a\n" PP.comment "Full Grammar" Print_Grammar.language language + ) + | "ast" -> ( + Format.printf "%a@.%a\n" PP.comment "AST" Print_AST.language language + ) + | _ -> exit 1 + diff --git a/src/ligo/ligo_multifix/lex/dune b/src/ligo/ligo_multifix/lex/dune new file mode 100644 index 000000000..e0f05760b --- /dev/null +++ b/src/ligo/ligo_multifix/lex/dune @@ -0,0 +1,24 @@ +(library + (name lex) + (public_name ligo.multifix.lex) + (modules token token_type lexer) +) + +(rule + (targets token_type.ml token_type.mli) + (deps token.mly) + (action (system "menhir --only-tokens token.mly --base token_type")) + (mode promote-until-clean) +) + +(alias + (name lexer.mll) + (deps token.ml) +) + +(rule + (targets lexer.ml) + (deps token.ml lexer.mll) + (action (system "ocamllex lexer.mll")) + (mode promote-until-clean) +) diff --git a/src/ligo/ligo_multifix/lex/lexer.ml b/src/ligo/ligo_multifix/lex/lexer.ml new file mode 100644 index 000000000..fb27d54f0 --- /dev/null +++ b/src/ligo/ligo_multifix/lex/lexer.ml @@ -0,0 +1,410 @@ +# 1 "lexer.mll" + + open Token + + exception Error of string + exception Unexpected_character of string + +# 9 "lexer.ml" +let __ocaml_lex_tables = { + Lexing.lex_base = + "\000\000\238\255\239\255\075\000\241\255\242\255\243\255\244\255\ + \245\255\246\255\247\255\248\255\160\000\235\000\041\000\014\000\ + \254\255\001\000\001\000\255\255\038\000\001\000\252\255\054\001\ + \129\001\204\001\023\002\098\002\173\002\248\002"; + Lexing.lex_backtrk = + "\255\255\255\255\255\255\017\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\017\000\017\000\017\000\002\000\ + \255\255\000\000\017\000\255\255\255\255\255\255\255\255\015\000\ + \015\000\015\000\004\000\015\000\006\000\005\000"; + Lexing.lex_default = + "\001\000\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\255\255\255\255\021\000\255\255\ + \000\000\255\255\255\255\000\000\021\000\255\255\000\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255"; + Lexing.lex_trans = + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\016\000\017\000\017\000\000\000\018\000\019\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \016\000\000\000\014\000\022\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\006\000\008\000\000\000\007\000\000\000\005\000\ + \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ + \015\000\015\000\000\000\009\000\000\000\004\000\015\000\015\000\ + \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ + \255\255\000\000\000\000\255\255\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\011\000\000\000\010\000\000\000\000\000\ + \000\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\012\000\003\000\003\000\013\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\020\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\000\000\000\000\ + \000\000\000\000\023\000\000\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\000\000\000\000\000\000\000\000\023\000\ + \002\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\029\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\000\000\255\255\000\000\ + \000\000\255\255\000\000\000\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\000\000\000\000\ + \000\000\000\000\023\000\000\000\023\000\023\000\023\000\023\000\ + \025\000\023\000\023\000\023\000\024\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\000\000\000\000\000\000\000\000\023\000\000\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\000\000\000\000\000\000\000\000\ + \023\000\000\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\027\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\000\000\ + \000\000\000\000\000\000\023\000\000\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \026\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\000\000\000\000\000\000\000\000\023\000\000\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\000\000\000\000\000\000\ + \000\000\023\000\000\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\028\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \000\000\000\000\000\000\000\000\023\000\000\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\000\000\000\000\000\000\000\000\023\000\ + \000\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000"; + Lexing.lex_check = + "\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\000\000\000\000\018\000\255\255\000\000\017\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \000\000\255\255\000\000\021\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\000\000\000\000\255\255\000\000\255\255\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\255\255\000\000\255\255\000\000\015\000\015\000\ + \015\000\015\000\015\000\015\000\015\000\015\000\015\000\015\000\ + \020\000\255\255\255\255\014\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\000\000\255\255\000\000\255\255\255\255\ + \255\255\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ + \000\000\000\000\000\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\014\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\255\255\255\255\ + \255\255\255\255\003\000\255\255\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\003\000\003\000\ + \003\000\003\000\003\000\003\000\003\000\003\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\255\255\255\255\255\255\255\255\012\000\ + \000\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\012\000\012\000\012\000\012\000\012\000\ + \012\000\012\000\012\000\013\000\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\255\255\020\000\255\255\ + \255\255\014\000\255\255\255\255\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\255\255\255\255\ + \255\255\255\255\013\000\255\255\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\013\000\013\000\ + \013\000\013\000\013\000\013\000\013\000\013\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\255\255\255\255\255\255\255\255\023\000\255\255\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\023\000\023\000\023\000\023\000\023\000\023\000\023\000\ + \023\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\255\255\255\255\255\255\255\255\ + \024\000\255\255\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\024\000\024\000\024\000\024\000\ + \024\000\024\000\024\000\024\000\025\000\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\255\255\ + \255\255\255\255\255\255\025\000\255\255\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\025\000\ + \025\000\025\000\025\000\025\000\025\000\025\000\025\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\255\255\255\255\255\255\255\255\026\000\255\255\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\026\000\026\000\026\000\026\000\026\000\026\000\ + \026\000\026\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\255\255\255\255\255\255\ + \255\255\027\000\255\255\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\027\000\027\000\027\000\ + \027\000\027\000\027\000\027\000\027\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \255\255\255\255\255\255\255\255\028\000\255\255\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \028\000\028\000\028\000\028\000\028\000\028\000\028\000\028\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\255\255\255\255\255\255\255\255\029\000\ + \255\255\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\029\000\029\000\029\000\029\000\029\000\ + \029\000\029\000\029\000\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\255\ + \255\255"; + Lexing.lex_base_code = + ""; + Lexing.lex_backtrk_code = + ""; + Lexing.lex_default_code = + ""; + Lexing.lex_trans_code = + ""; + Lexing.lex_check_code = + ""; + Lexing.lex_code = + ""; +} + +let rec token lexbuf = + __ocaml_lex_token_rec lexbuf 0 +and __ocaml_lex_token_rec lexbuf __ocaml_lex_state = + match Lexing.engine __ocaml_lex_tables __ocaml_lex_state lexbuf with + | 0 -> +# 17 "lexer.mll" + ( Lexing.new_line lexbuf; token lexbuf ) +# 305 "lexer.ml" + + | 1 -> +# 19 "lexer.mll" + ( token lexbuf ) +# 310 "lexer.ml" + + | 2 -> +let +# 20 "lexer.mll" + i +# 316 "lexer.ml" += Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in +# 21 "lexer.mll" + ( INT (int_of_string i) ) +# 320 "lexer.ml" + + | 3 -> +let +# 22 "lexer.mll" + s +# 326 "lexer.ml" += Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos (lexbuf.Lexing.lex_curr_pos + -1) in +# 23 "lexer.mll" + ( STRING s ) +# 330 "lexer.ml" + + | 4 -> +# 24 "lexer.mll" + ( LET ) +# 335 "lexer.ml" + + | 5 -> +# 25 "lexer.mll" + ( IN ) +# 340 "lexer.ml" + + | 6 -> +# 26 "lexer.mll" + ( LIST ) +# 345 "lexer.ml" + + | 7 -> +# 27 "lexer.mll" + ( LSQUARE ) +# 350 "lexer.ml" + + | 8 -> +# 28 "lexer.mll" + ( RSQUARE ) +# 355 "lexer.ml" + + | 9 -> +# 29 "lexer.mll" + ( SEMICOLON ) +# 360 "lexer.ml" + + | 10 -> +# 30 "lexer.mll" + ( PLUS ) +# 365 "lexer.ml" + + | 11 -> +# 31 "lexer.mll" + ( MINUS ) +# 370 "lexer.ml" + + | 12 -> +# 32 "lexer.mll" + ( TIMES ) +# 375 "lexer.ml" + + | 13 -> +# 33 "lexer.mll" + ( DIV ) +# 380 "lexer.ml" + + | 14 -> +# 34 "lexer.mll" + ( EQUAL ) +# 385 "lexer.ml" + + | 15 -> +let +# 35 "lexer.mll" + v +# 391 "lexer.ml" += Lexing.sub_lexeme lexbuf lexbuf.Lexing.lex_start_pos lexbuf.Lexing.lex_curr_pos in +# 36 "lexer.mll" + ( NAME v ) +# 395 "lexer.ml" + + | 16 -> +# 37 "lexer.mll" + ( EOF ) +# 400 "lexer.ml" + + | 17 -> +# 39 "lexer.mll" + ( raise (Unexpected_character (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) ) +# 405 "lexer.ml" + + | __ocaml_lex_state -> lexbuf.Lexing.refill_buff lexbuf; + __ocaml_lex_token_rec lexbuf __ocaml_lex_state + +;; + diff --git a/src/ligo/ligo_multifix/lex/lexer.mll b/src/ligo/ligo_multifix/lex/lexer.mll new file mode 100644 index 000000000..a3023282d --- /dev/null +++ b/src/ligo/ligo_multifix/lex/lexer.mll @@ -0,0 +1,39 @@ +{ + open Token + + exception Error of string + exception Unexpected_character of string +} + +(* This rule analyzes a single line and turns it into a stream of + tokens. *) + +rule token = parse +(* + | "//" ([^ '\n']* ) (['\n' '\r']+) + { Lexing.new_line lexbuf ; token lexbuf } +*) +| ('\r'? '\n' '\r'?) + { Lexing.new_line lexbuf; token lexbuf } +| [' ' '\t'] + { token lexbuf } +| ['0'-'9']+ as i + { INT (int_of_string i) } +| '"' ( [^ '"' '\\'] | ( '\\' [^ '"'] ) ) as s '"' + { STRING s } +| "let" { LET } +| "in" { IN } +| "list" { LIST } +| "[" { LSQUARE } +| "]" { RSQUARE } +| ";" { SEMICOLON } +| "+" { PLUS } +| "-" { MINUS } +| "*" { TIMES } +| "/" { DIV } +| "=" { EQUAL } +| (['a'-'z']['a'-'z''A'-'Z''0'-'9''_']+) as v + { NAME v } +| eof { EOF } +| _ + { raise (Unexpected_character (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) } diff --git a/src/ligo/ligo_multifix/lex/token.ml b/src/ligo/ligo_multifix/lex/token.ml new file mode 100644 index 000000000..5c8530862 --- /dev/null +++ b/src/ligo/ligo_multifix/lex/token.ml @@ -0,0 +1,18 @@ +include Token_type + +let to_string : token -> string = function + | TIMES -> "TIMES" + | STRING _ -> "STRING" + | NAME _ -> "NAME s" + | INT _ -> "INT n" + | SEMICOLON -> "SEMICOLON" + | RSQUARE -> "RSQUARE" + | PLUS -> "PLUS" + | MINUS -> "MINUS" + | LSQUARE -> "LSQUARE" + | LIST -> "LIST" + | LET -> "LET" + | IN -> "IN" + | EQUAL -> "EQUAL" + | EOF -> "EOF" + | DIV -> "DIV" diff --git a/src/ligo/ligo_multifix/lex/token.mly b/src/ligo/ligo_multifix/lex/token.mly new file mode 100644 index 000000000..f2546f408 --- /dev/null +++ b/src/ligo/ligo_multifix/lex/token.mly @@ -0,0 +1,9 @@ +%token EOF +%token INT +%token STRING +%token NAME +%token LET IN EQUAL +%token PLUS MINUS TIMES DIV +%token LIST LSQUARE RSQUARE SEMICOLON + +%% diff --git a/src/ligo/ligo_multifix/lex/token_type.ml b/src/ligo/ligo_multifix/lex/token_type.ml new file mode 100644 index 000000000..c1fcb71a2 --- /dev/null +++ b/src/ligo/ligo_multifix/lex/token_type.ml @@ -0,0 +1,17 @@ + +type token = + | TIMES + | STRING of (string) + | SEMICOLON + | RSQUARE + | PLUS + | NAME of (string) + | MINUS + | LSQUARE + | LIST + | LET + | INT of (int) + | IN + | EQUAL + | EOF + | DIV diff --git a/src/ligo/ligo_multifix/lex/token_type.mli b/src/ligo/ligo_multifix/lex/token_type.mli new file mode 100644 index 000000000..ff955f089 --- /dev/null +++ b/src/ligo/ligo_multifix/lex/token_type.mli @@ -0,0 +1,19 @@ + +(* The type of tokens. *) + +type token = + | TIMES + | STRING of (string) + | SEMICOLON + | RSQUARE + | PLUS + | NAME of (string) + | MINUS + | LSQUARE + | LIST + | LET + | INT of (int) + | IN + | EQUAL + | EOF + | DIV diff --git a/src/ligo/ligo_multifix/lexer.mll b/src/ligo/ligo_multifix/lexer.mll new file mode 100644 index 000000000..37d24e556 --- /dev/null +++ b/src/ligo/ligo_multifix/lexer.mll @@ -0,0 +1,39 @@ +{ + open Token + + exception Error of string + exception Unexpected_character of string +} + +(* This rule analyzes a single line and turns it into a stream of + tokens. *) + +rule token = parse +(* + | "//" ([^ '\n']* ) (['\n' '\r']+) + { Lexing.new_line lexbuf ; token lexbuf } +*) +| ('\r'? '\n' '\r'?) + { Lexing.new_line lexbuf; token lexbuf } +| [' ' '\t'] + { token lexbuf } +| ['0'-'9']+ as i + { INT (int_of_string i) } +| '"' ( [^ '"' '\\'] | ( '\\' [^ '"'] ) ) as s '"' + { STRING s } +| (['a'-'z']['a'-'z''A'-'Z''0'-'9''_']+) as v + { NAME v } +| "let" { LET } +| "in" { IN } +| "list" { LIST } +| "[" { LSQUARE } +| "]" { RSQUARE } +| ";" { SEMICOLON } +| "+" { PLUS } +| "-" { MINUS } +| "*" { TIMES } +| "/" { DIV } +| "=" { EQUAL } +| eof { EOF } +| _ + { raise (Unexpected_character (Printf.sprintf "At offset %d: unexpected character.\n" (Lexing.lexeme_start lexbuf))) } diff --git a/src/ligo/ligo_multifix/location.ml b/src/ligo/ligo_multifix/location.ml new file mode 100644 index 000000000..5fbea6e3b --- /dev/null +++ b/src/ligo/ligo_multifix/location.ml @@ -0,0 +1,31 @@ +type file_location = { + filename : string ; + start_line : int ; + start_column : int ; + end_line : int ; + end_column : int ; +} + +type virtual_location = string + +type t = + | File of file_location + | Virtual of virtual_location + +let make (start_pos:Lexing.position) (end_pos:Lexing.position) : t = + let filename = start_pos.pos_fname in + let start_line = start_pos.pos_lnum in + let end_line = end_pos.pos_lnum in + let start_column = start_pos.pos_cnum - start_pos.pos_bol in + let end_column = end_pos.pos_cnum - end_pos.pos_bol in + File { filename ; start_line ; start_column ; end_line ; end_column } + +let virtual_location s = Virtual s +let dummy = virtual_location "dummy" + +type 'a wrap = { + wrap_content : 'a ; + location : t ; +} + +let wrap ~loc wrap_content = { wrap_content ; location = loc } diff --git a/src/ligo/ligo_multifix/parser.ml b/src/ligo/ligo_multifix/parser.ml new file mode 100644 index 000000000..82e5e498b --- /dev/null +++ b/src/ligo/ligo_multifix/parser.ml @@ -0,0 +1,874 @@ + +module MenhirBasics = struct + + exception Error + + type token = Lex.Token.token + +end + +include MenhirBasics + +let _eRR = + MenhirBasics.Error + +type _menhir_env = { + _menhir_lexer: Lexing.lexbuf -> token; + _menhir_lexbuf: Lexing.lexbuf; + _menhir_token: token; + mutable _menhir_error: bool +} + +and _menhir_state = + | MenhirState30 + | MenhirState27 + | MenhirState25 + | MenhirState22 + | MenhirState20 + | MenhirState17 + | MenhirState15 + | MenhirState11 + | MenhirState5 + | MenhirState0 + +# 1 "parser.mly" + + open Ast + +# 39 "parser.ml" + +let rec _menhir_goto_arith_0 : _menhir_env -> 'ttv_tail -> Lexing.position -> _menhir_state -> 'tv_arith_0 -> 'ttv_return = + fun _menhir_env _menhir_stack _endpos _menhir_s _v -> + let _menhir_stack = (_menhir_stack, _endpos, _menhir_s, _v) in + match _menhir_s with + | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv133 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.IN -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv129 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LET -> + _menhir_run15 _menhir_env (Obj.magic _menhir_stack) MenhirState30 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState30 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState30 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState30) : 'freshtv130) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((('freshtv131 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv132)) : 'freshtv134) + | MenhirState30 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((((('freshtv137 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0)) * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ((((('freshtv135 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0)) * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let ((((_menhir_stack, _menhir_s, _startpos__1_), _endpos_a_, _, (a : 'tv_variable), _startpos_a_), _endpos_b_, _, (b : 'tv_arith_0)), _endpos_c_, _, (c : 'tv_arith_0)) = _menhir_stack in + let _5 = () in + let _3 = () in + let _1 = () in + let _endpos = _endpos_c_ in + let _v : 'tv_arith_0 = let _endpos = _endpos_c_ in + let _startpos = _startpos__1_ in + +# 95 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Let_in (a , b , c) + ) +# 92 "parser.ml" + in + _menhir_goto_arith_0 _menhir_env _menhir_stack _endpos _menhir_s _v) : 'freshtv136)) : 'freshtv138) + | MenhirState0 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv151 * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.EOF -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv147 * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv145 * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _endpos__1_, _menhir_s, (_1 : 'tv_arith_0)) = _menhir_stack in + let _2 = () in + let _v : ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 111 "parser.ml" + ) = let _1 = +# 47 "parser.mly" + ( _1 ) +# 115 "parser.ml" + in + +# 33 "parser.mly" + ( _1 ) +# 120 "parser.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv143) = _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 128 "parser.ml" + )) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv141) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 136 "parser.ml" + )) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv139) = Obj.magic _menhir_stack in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 144 "parser.ml" + )) : ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 148 "parser.ml" + )) = _v in + (Obj.magic _1 : 'freshtv140)) : 'freshtv142)) : 'freshtv144)) : 'freshtv146)) : 'freshtv148) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv149 * Lexing.position * _menhir_state * 'tv_arith_0) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv150)) : 'freshtv152) + | _ -> + _menhir_fail () + +and _menhir_goto_arith_1 : _menhir_env -> 'ttv_tail -> Lexing.position -> _menhir_state -> 'tv_arith_1 -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _endpos _menhir_s _v _startpos -> + let _menhir_stack = (_menhir_stack, _endpos, _menhir_s, _v, _startpos) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv127 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.MINUS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv119 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState27 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState27 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState27) : 'freshtv120) + | Lex.Token.PLUS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv121 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState25 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState25 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState25) : 'freshtv122) + | Lex.Token.EOF | Lex.Token.IN -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv123 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _endpos__1_, _menhir_s, (_1 : 'tv_arith_1), _startpos__1_) = _menhir_stack in + let _endpos = _endpos__1_ in + let _v : 'tv_arith_0 = +# 99 "parser.mly" + ( _1 ) +# 205 "parser.ml" + in + _menhir_goto_arith_0 _menhir_env _menhir_stack _endpos _menhir_s _v) : 'freshtv124) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv125 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv126)) : 'freshtv128) + +and _menhir_run20 : _menhir_env -> 'ttv_tail * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack -> + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState20 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState20 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState20 + +and _menhir_run22 : _menhir_env -> 'ttv_tail * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack -> + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState22 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState22 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState22 + +and _menhir_fail : unit -> 'a = + fun () -> + Printf.fprintf stderr "Internal failure -- please contact the parser generator's developers.\n%!"; + assert false + +and _menhir_goto_arith_2 : _menhir_env -> 'ttv_tail -> Lexing.position -> _menhir_state -> 'tv_arith_2 -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _endpos _menhir_s _v _startpos -> + let _menhir_stack = (_menhir_stack, _endpos, _menhir_s, _v, _startpos) in + match _menhir_s with + | MenhirState0 | MenhirState30 | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv105 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.DIV -> + _menhir_run22 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.TIMES -> + _menhir_run20 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.EOF | Lex.Token.IN | Lex.Token.MINUS | Lex.Token.PLUS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv101 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _endpos__1_, _menhir_s, (_1 : 'tv_arith_2), _startpos__1_) = _menhir_stack in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : 'tv_arith_1 = +# 91 "parser.mly" + ( _1 ) +# 272 "parser.ml" + in + _menhir_goto_arith_1 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv102) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv103 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv104)) : 'freshtv106) + | MenhirState25 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv111 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.DIV -> + _menhir_run22 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.TIMES -> + _menhir_run20 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.EOF | Lex.Token.IN | Lex.Token.MINUS | Lex.Token.PLUS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv107 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _endpos_a_, _menhir_s, (a : 'tv_arith_1), _startpos_a_), _endpos_b_, _, (b : 'tv_arith_2), _startpos_b_) = _menhir_stack in + let _2 = () in + let _startpos = _startpos_a_ in + let _endpos = _endpos_b_ in + let _v : 'tv_arith_1 = let _endpos = _endpos_b_ in + let _startpos = _startpos_a_ in + +# 81 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Addition (a , b) + ) +# 307 "parser.ml" + in + _menhir_goto_arith_1 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv108) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv109 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv110)) : 'freshtv112) + | MenhirState27 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv117 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.DIV -> + _menhir_run22 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.TIMES -> + _menhir_run20 _menhir_env (Obj.magic _menhir_stack) + | Lex.Token.EOF | Lex.Token.IN | Lex.Token.MINUS | Lex.Token.PLUS -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv113 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _endpos_a_, _menhir_s, (a : 'tv_arith_1), _startpos_a_), _endpos_b_, _, (b : 'tv_arith_2), _startpos_b_) = _menhir_stack in + let _2 = () in + let _startpos = _startpos_a_ in + let _endpos = _endpos_b_ in + let _v : 'tv_arith_1 = let _endpos = _endpos_b_ in + let _startpos = _startpos_a_ in + +# 87 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Substraction (a , b) + ) +# 342 "parser.ml" + in + _menhir_goto_arith_1 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv114) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv115 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv116)) : 'freshtv118) + | _ -> + _menhir_fail () + +and _menhir_goto_lead_list_content_SEMICOLON_arith_3_ : _menhir_env -> 'ttv_tail -> 'tv_lead_list_content_SEMICOLON_arith_3_ -> 'ttv_return = + fun _menhir_env _menhir_stack _v -> + let _menhir_stack = (_menhir_stack, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv99 * 'tv_lead_list_content_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.SEMICOLON -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv93 * 'tv_lead_list_content_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState11 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState11 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState11) : 'freshtv94) + | Lex.Token.RSQUARE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv95 * 'tv_lead_list_content_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + ((let (_menhir_stack, (_1 : 'tv_lead_list_content_SEMICOLON_arith_3_)) = _menhir_stack in + let _v : 'tv_lead_list_SEMICOLON_arith_3_ = +# 22 "parser.mly" + ( _1 ) +# 384 "parser.ml" + in + _menhir_goto_lead_list_SEMICOLON_arith_3_ _menhir_env _menhir_stack _v) : 'freshtv96) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv97 * 'tv_lead_list_content_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv98)) : 'freshtv100) + +and _menhir_goto_arith_3 : _menhir_env -> 'ttv_tail -> Lexing.position -> _menhir_state -> 'tv_arith_3 -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _endpos _menhir_s _v _startpos -> + match _menhir_s with + | MenhirState5 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv75 * 'tv_option_SEMICOLON_) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_3) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv73 * 'tv_option_SEMICOLON_) = Obj.magic _menhir_stack in + let (_endpos_x_ : Lexing.position) = _endpos in + let (_ : _menhir_state) = _menhir_s in + let ((x : 'tv_arith_3) : 'tv_arith_3) = _v in + let (_startpos_x_ : Lexing.position) = _startpos in + ((let (_menhir_stack, (_1 : 'tv_option_SEMICOLON_)) = _menhir_stack in + let _v : 'tv_lead_list_first_SEMICOLON_arith_3_ = +# 29 "parser.mly" + ( [ x ] ) +# 414 "parser.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv71) = _menhir_stack in + let (_v : 'tv_lead_list_first_SEMICOLON_arith_3_) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv69) = Obj.magic _menhir_stack in + let (_v : 'tv_lead_list_first_SEMICOLON_arith_3_) = _v in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv67) = Obj.magic _menhir_stack in + let ((x : 'tv_lead_list_first_SEMICOLON_arith_3_) : 'tv_lead_list_first_SEMICOLON_arith_3_) = _v in + ((let _v : 'tv_lead_list_content_SEMICOLON_arith_3_ = +# 25 "parser.mly" + ( x ) +# 428 "parser.ml" + in + _menhir_goto_lead_list_content_SEMICOLON_arith_3_ _menhir_env _menhir_stack _v) : 'freshtv68)) : 'freshtv70)) : 'freshtv72)) : 'freshtv74)) : 'freshtv76) + | MenhirState11 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv79 * 'tv_lead_list_content_SEMICOLON_arith_3_)) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_3) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv77 * 'tv_lead_list_content_SEMICOLON_arith_3_)) = Obj.magic _menhir_stack in + let (_endpos_x_ : Lexing.position) = _endpos in + let (_ : _menhir_state) = _menhir_s in + let ((x : 'tv_arith_3) : 'tv_arith_3) = _v in + let (_startpos_x_ : Lexing.position) = _startpos in + ((let (_menhir_stack, (xs : 'tv_lead_list_content_SEMICOLON_arith_3_)) = _menhir_stack in + let _2 = () in + let _v : 'tv_lead_list_content_SEMICOLON_arith_3_ = +# 26 "parser.mly" + ( xs @ [ x ] ) +# 449 "parser.ml" + in + _menhir_goto_lead_list_content_SEMICOLON_arith_3_ _menhir_env _menhir_stack _v) : 'freshtv78)) : 'freshtv80) + | MenhirState0 | MenhirState30 | MenhirState27 | MenhirState25 | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv83) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_3) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv81) = Obj.magic _menhir_stack in + let (_endpos__1_ : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : 'tv_arith_3) : 'tv_arith_3) = _v in + let (_startpos__1_ : Lexing.position) = _startpos in + ((let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : 'tv_arith_2 = +# 77 "parser.mly" + ( _1 ) +# 470 "parser.ml" + in + _menhir_goto_arith_2 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv82)) : 'freshtv84) + | MenhirState20 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv87 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_3) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv85 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + let (_endpos_b_ : Lexing.position) = _endpos in + let (_ : _menhir_state) = _menhir_s in + let ((b : 'tv_arith_3) : 'tv_arith_3) = _v in + let (_startpos_b_ : Lexing.position) = _startpos in + ((let (_menhir_stack, _endpos_a_, _menhir_s, (a : 'tv_arith_2), _startpos_a_) = _menhir_stack in + let _2 = () in + let _startpos = _startpos_a_ in + let _endpos = _endpos_b_ in + let _v : 'tv_arith_2 = let _endpos = _endpos_b_ in + let _startpos = _startpos_a_ in + +# 67 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Multiplication (a , b) + ) +# 498 "parser.ml" + in + _menhir_goto_arith_2 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv86)) : 'freshtv88) + | MenhirState22 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv91 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_3) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv89 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + let (_endpos_b_ : Lexing.position) = _endpos in + let (_ : _menhir_state) = _menhir_s in + let ((b : 'tv_arith_3) : 'tv_arith_3) = _v in + let (_startpos_b_ : Lexing.position) = _startpos in + ((let (_menhir_stack, _endpos_a_, _menhir_s, (a : 'tv_arith_2), _startpos_a_) = _menhir_stack in + let _2 = () in + let _startpos = _startpos_a_ in + let _endpos = _endpos_b_ in + let _v : 'tv_arith_2 = let _endpos = _endpos_b_ in + let _startpos = _startpos_a_ in + +# 73 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Division (a , b) + ) +# 526 "parser.ml" + in + _menhir_goto_arith_2 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv90)) : 'freshtv92) + | _ -> + _menhir_fail () + +and _menhir_goto_lead_list_SEMICOLON_arith_3_ : _menhir_env -> 'ttv_tail -> 'tv_lead_list_SEMICOLON_arith_3_ -> 'ttv_return = + fun _menhir_env _menhir_stack _v -> + let _menhir_stack = (_menhir_stack, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv65 * _menhir_state * Lexing.position)) * 'tv_lead_list_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.RSQUARE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv61 * _menhir_state * Lexing.position)) * 'tv_lead_list_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _menhir_env._menhir_lexbuf.Lexing.lex_curr_p in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv59 * _menhir_state * Lexing.position)) * 'tv_lead_list_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + let (_endpos__4_ : Lexing.position) = _endpos in + ((let ((_menhir_stack, _menhir_s, _startpos__1_), (a : 'tv_lead_list_SEMICOLON_arith_3_)) = _menhir_stack in + let _4 = () in + let _2 = () in + let _1 = () in + let _startpos = _startpos__1_ in + let _endpos = _endpos__4_ in + let _v : 'tv_arith_3 = let _endpos = _endpos__4_ in + let _startpos = _startpos__1_ in + +# 59 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ List (a) + ) +# 562 "parser.ml" + in + _menhir_goto_arith_3 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv60)) : 'freshtv62) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv63 * _menhir_state * Lexing.position)) * 'tv_lead_list_SEMICOLON_arith_3_) = Obj.magic _menhir_stack in + ((let ((_menhir_stack, _menhir_s, _), _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv64)) : 'freshtv66) + +and _menhir_goto_option_SEMICOLON_ : _menhir_env -> 'ttv_tail -> 'tv_option_SEMICOLON_ -> 'ttv_return = + fun _menhir_env _menhir_stack _v -> + let _menhir_stack = (_menhir_stack, _v) in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv57 * 'tv_option_SEMICOLON_) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState5 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState5 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState5) : 'freshtv58) + +and _menhir_errorcase : _menhir_env -> 'ttv_tail -> _menhir_state -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s -> + match _menhir_s with + | MenhirState30 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (((('freshtv37 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) * Lexing.position * _menhir_state * 'tv_arith_0)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv38) + | MenhirState27 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv39 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv40) + | MenhirState25 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv41 * Lexing.position * _menhir_state * 'tv_arith_1 * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv42) + | MenhirState22 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv43 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv44) + | MenhirState20 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv45 * Lexing.position * _menhir_state * 'tv_arith_2 * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv46) + | MenhirState17 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : (('freshtv47 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv48) + | MenhirState15 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv49 * _menhir_state * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv50) + | MenhirState11 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv51 * 'tv_lead_list_content_SEMICOLON_arith_3_)) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv52) + | MenhirState5 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv53 * 'tv_option_SEMICOLON_) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv54) + | MenhirState0 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv55) = Obj.magic _menhir_stack in + (raise _eRR : 'freshtv56) + +and _menhir_run1 : _menhir_env -> 'ttv_tail -> Lexing.position -> _menhir_state -> ( +# 4 "lex/token.mly" + (string) +# 644 "parser.ml" +) -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _endpos _menhir_s _v _startpos -> + let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv35) = Obj.magic _menhir_stack in + let (_endpos__1_ : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : ( +# 4 "lex/token.mly" + (string) +# 655 "parser.ml" + )) : ( +# 4 "lex/token.mly" + (string) +# 659 "parser.ml" + )) = _v in + let (_startpos__1_ : Lexing.position) = _startpos in + ((let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : 'tv_variable = let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + +# 38 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc _1 + ) +# 672 "parser.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv33) = _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_variable) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let _menhir_stack = (_menhir_stack, _endpos, _menhir_s, _v, _startpos) in + match _menhir_s with + | MenhirState0 | MenhirState30 | MenhirState27 | MenhirState25 | MenhirState22 | MenhirState20 | MenhirState17 | MenhirState11 | MenhirState5 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv25 * Lexing.position * _menhir_state * 'tv_variable * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv23 * Lexing.position * _menhir_state * 'tv_variable * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _endpos_a_, _menhir_s, (a : 'tv_variable), _startpos_a_) = _menhir_stack in + let _startpos = _startpos_a_ in + let _endpos = _endpos_a_ in + let _v : 'tv_arith_4 = let _endpos = _endpos_a_ in + let _startpos = _startpos_a_ in + +# 52 "parser.mly" + ( + let loc = Location.make _startpos _endpos in + Location.wrap ~loc @@ Arith_variable (a) + ) +# 698 "parser.ml" + in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv21) = _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_4) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv19) = Obj.magic _menhir_stack in + let (_endpos : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let (_v : 'tv_arith_4) = _v in + let (_startpos : Lexing.position) = _startpos in + ((let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv17) = Obj.magic _menhir_stack in + let (_endpos__1_ : Lexing.position) = _endpos in + let (_menhir_s : _menhir_state) = _menhir_s in + let ((_1 : 'tv_arith_4) : 'tv_arith_4) = _v in + let (_startpos__1_ : Lexing.position) = _startpos in + ((let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : 'tv_arith_3 = +# 63 "parser.mly" + ( _1 ) +# 723 "parser.ml" + in + _menhir_goto_arith_3 _menhir_env _menhir_stack _endpos _menhir_s _v _startpos) : 'freshtv18)) : 'freshtv20)) : 'freshtv22)) : 'freshtv24)) : 'freshtv26) + | MenhirState15 -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv31 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position) = Obj.magic _menhir_stack in + ((assert (not _menhir_env._menhir_error); + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.EQUAL -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv27 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LET -> + _menhir_run15 _menhir_env (Obj.magic _menhir_stack) MenhirState17 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState17 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState17 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState17) : 'freshtv28) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv29 * _menhir_state * Lexing.position) * Lexing.position * _menhir_state * 'tv_variable * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _, _menhir_s, _, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv30)) : 'freshtv32)) : 'freshtv34)) : 'freshtv36) + +and _menhir_run2 : _menhir_env -> 'ttv_tail -> _menhir_state -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _startpos -> + let _menhir_stack = (_menhir_stack, _menhir_s, _startpos) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LSQUARE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv13 * _menhir_state * Lexing.position) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.SEMICOLON -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv5) = Obj.magic _menhir_stack in + ((let _menhir_env = _menhir_discard _menhir_env in + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv3) = Obj.magic _menhir_stack in + ((let x = () in + let _v : 'tv_option_SEMICOLON_ = +# 116 "/home/user/.opam/tezos/lib/menhir/standard.mly" + ( Some x ) +# 778 "parser.ml" + in + _menhir_goto_option_SEMICOLON_ _menhir_env _menhir_stack _v) : 'freshtv4)) : 'freshtv6) + | Lex.Token.LIST | Lex.Token.NAME _ -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv7) = Obj.magic _menhir_stack in + ((let _v : 'tv_option_SEMICOLON_ = +# 114 "/home/user/.opam/tezos/lib/menhir/standard.mly" + ( None ) +# 787 "parser.ml" + in + _menhir_goto_option_SEMICOLON_ _menhir_env _menhir_stack _v) : 'freshtv8) + | Lex.Token.RSQUARE -> + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv9) = Obj.magic _menhir_stack in + ((let _v : 'tv_lead_list_SEMICOLON_arith_3_ = +# 21 "parser.mly" + ( [] ) +# 796 "parser.ml" + in + _menhir_goto_lead_list_SEMICOLON_arith_3_ _menhir_env _menhir_stack _v) : 'freshtv10) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : ('freshtv11 * _menhir_state * Lexing.position)) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv12)) : 'freshtv14) + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv15 * _menhir_state * Lexing.position) = Obj.magic _menhir_stack in + ((let (_menhir_stack, _menhir_s, _) = _menhir_stack in + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) _menhir_s) : 'freshtv16) + +and _menhir_run15 : _menhir_env -> 'ttv_tail -> _menhir_state -> Lexing.position -> 'ttv_return = + fun _menhir_env _menhir_stack _menhir_s _startpos -> + let _menhir_stack = (_menhir_stack, _menhir_s, _startpos) in + let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState15 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState15 + +and _menhir_discard : _menhir_env -> _menhir_env = + fun _menhir_env -> + let lexer = _menhir_env._menhir_lexer in + let lexbuf = _menhir_env._menhir_lexbuf in + let _tok = lexer lexbuf in + { + _menhir_lexer = lexer; + _menhir_lexbuf = lexbuf; + _menhir_token = _tok; + _menhir_error = false; + } + +and entry_point : (Lexing.lexbuf -> token) -> Lexing.lexbuf -> ( +# 5 "parser.mly" + (Ast.entry_point Location.wrap) +# 842 "parser.ml" +) = + fun lexer lexbuf -> + let _menhir_env = + let (lexer : Lexing.lexbuf -> token) = lexer in + let (lexbuf : Lexing.lexbuf) = lexbuf in + ((let _tok = Obj.magic () in + { + _menhir_lexer = lexer; + _menhir_lexbuf = lexbuf; + _menhir_token = _tok; + _menhir_error = false; + }) : _menhir_env) + in + Obj.magic (let (_menhir_env : _menhir_env) = _menhir_env in + let (_menhir_stack : 'freshtv1) = ((), _menhir_env._menhir_lexbuf.Lexing.lex_curr_p) in + ((let _menhir_env = _menhir_discard _menhir_env in + let _tok = _menhir_env._menhir_token in + match _tok with + | Lex.Token.LET -> + _menhir_run15 _menhir_env (Obj.magic _menhir_stack) MenhirState0 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.LIST -> + _menhir_run2 _menhir_env (Obj.magic _menhir_stack) MenhirState0 _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | Lex.Token.NAME _v -> + _menhir_run1 _menhir_env (Obj.magic _menhir_stack) _menhir_env._menhir_lexbuf.Lexing.lex_curr_p MenhirState0 _v _menhir_env._menhir_lexbuf.Lexing.lex_start_p + | _ -> + assert (not _menhir_env._menhir_error); + _menhir_env._menhir_error <- true; + _menhir_errorcase _menhir_env (Obj.magic _menhir_stack) MenhirState0) : 'freshtv2)) + +# 269 "/home/user/.opam/tezos/lib/menhir/standard.mly" + + +# 875 "parser.ml" diff --git a/src/ligo/ligo_multifix/parser.mli b/src/ligo/ligo_multifix/parser.mli new file mode 100644 index 000000000..7c93c3f9b --- /dev/null +++ b/src/ligo/ligo_multifix/parser.mli @@ -0,0 +1,12 @@ + +(* The type of tokens. *) + +type token = Lex.Token.token + +(* This exception is raised by the monolithic API functions. *) + +exception Error + +(* The monolithic API. *) + +val entry_point: (Lexing.lexbuf -> token) -> Lexing.lexbuf -> (Ast.entry_point Location.wrap) diff --git a/src/ligo/ligo_multifix/parser.mly b/src/ligo/ligo_multifix/parser.mly new file mode 100644 index 000000000..577e959a8 --- /dev/null +++ b/src/ligo/ligo_multifix/parser.mly @@ -0,0 +1,99 @@ +%{ + open Ast +%} + +%start entry_point + +%% + +trail_list(separator, X): + | { [] } + | trail_list_content(separator, X) { $1 } + +trail_list_content(separator, X): + | x = trail_list_last(separator, X) { x } + | x = X separator xs = trail_list_content(separator, X) { x :: xs } + +trail_list_last(separator, X): + | x = X option(separator) { [ x ] } + +lead_list(separator, X): + | { [] } + | lead_list_content(separator, X) { $1 } + +lead_list_content(separator, X): + | x = lead_list_first(separator, X) { x } + | xs = lead_list_content(separator, X) separator x = X { xs @ [ x ] } + +lead_list_first (separator, X): + | option(separator) x = X { [ x ] } +(* Full Grammar *) +(* Generated Language *) + +entry_point : arith EOF { $1 } + +(* Singletons *) + +variable : NAME + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc $1 + } + + +(* Hierarchies *) + +(* Top-level for arith *) +%inline arith : arith_0 { $1 } + +arith_4 : + (* Arith_variable *) + | a = variable + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Arith_variable (a) + } +arith_3 : + (* List *) + | LIST LSQUARE a = lead_list(SEMICOLON, arith_3) RSQUARE + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ List (a) + } + | arith_4 { $1 } +arith_2 : + (* Multiplication *) + | a = arith_2 TIMES b = arith_3 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Multiplication (a , b) + } + (* Division *) + | a = arith_2 DIV b = arith_3 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Division (a , b) + } + | arith_3 { $1 } +arith_1 : + (* Addition *) + | a = arith_1 PLUS b = arith_2 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Addition (a , b) + } + (* Substraction *) + | a = arith_1 MINUS b = arith_2 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Substraction (a , b) + } + | arith_2 { $1 } +arith_0 : + (* Let_in *) + | LET a = variable EQUAL b = arith_0 IN c = arith_0 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Let_in (a , b , c) + } + | arith_1 { $1 } diff --git a/src/ligo/ligo_multifix/partial_parser.mly b/src/ligo/ligo_multifix/partial_parser.mly new file mode 100644 index 000000000..507ae7163 --- /dev/null +++ b/src/ligo/ligo_multifix/partial_parser.mly @@ -0,0 +1,70 @@ +(* Full Grammar *) +(* Generated Language *) + +entry_point : arith EOF { $1 } + +(* Singletons *) + +variable : NAME + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc $1 + } + + +(* Hierarchies *) + +(* Top-level for arith *) +%inline arith : arith_0 { $1 } + +arith_4 : + (* Arith_variable *) + | a = variable + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Arith_variable (a) + } +arith_3 : + (* List *) + | LIST LSQUARE a = lead_list(SEMICOLON, arith_3) RSQUARE + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ List (a) + } + | arith_4 { $1 } +arith_2 : + (* Multiplication *) + | a = arith_2 TIMES b = arith_3 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Multiplication (a , b) + } + (* Division *) + | a = arith_2 DIV b = arith_3 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Division (a , b) + } + | arith_3 { $1 } +arith_1 : + (* Addition *) + | a = arith_1 PLUS b = arith_2 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Addition (a , b) + } + (* Substraction *) + | a = arith_1 MINUS b = arith_2 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Substraction (a , b) + } + | arith_2 { $1 } +arith_0 : + (* Let_in *) + | LET a = variable EQUAL b = arith_0 IN c = arith_0 + { + let loc = Location.make $startpos $endpos in + Location.wrap ~loc @@ Let_in (a , b , c) + } + | arith_1 { $1 } diff --git a/src/ligo/ligo_multifix/pre_parser.mly b/src/ligo/ligo_multifix/pre_parser.mly new file mode 100644 index 000000000..4df86927b --- /dev/null +++ b/src/ligo/ligo_multifix/pre_parser.mly @@ -0,0 +1,29 @@ +%{ + open Ast +%} + +%start entry_point + +%% + +trail_list(separator, X): + | { [] } + | trail_list_content(separator, X) { $1 } + +trail_list_content(separator, X): + | x = trail_list_last(separator, X) { x } + | x = X separator xs = trail_list_content(separator, X) { x :: xs } + +trail_list_last(separator, X): + | x = X option(separator) { [ x ] } + +lead_list(separator, X): + | { [] } + | lead_list_content(separator, X) { $1 } + +lead_list_content(separator, X): + | x = lead_list_first(separator, X) { x } + | xs = lead_list_content(separator, X) separator x = X { xs @ [ x ] } + +lead_list_first (separator, X): + | option(separator) x = X { [ x ] } diff --git a/src/ligo/ligo_multifix/token.mly b/src/ligo/ligo_multifix/token.mly new file mode 100644 index 000000000..f2546f408 --- /dev/null +++ b/src/ligo/ligo_multifix/token.mly @@ -0,0 +1,9 @@ +%token EOF +%token INT +%token STRING +%token NAME +%token LET IN EQUAL +%token PLUS MINUS TIMES DIV +%token LIST LSQUARE RSQUARE SEMICOLON + +%% diff --git a/src/ligo/ligo_multifix/user.ml b/src/ligo/ligo_multifix/user.ml new file mode 100644 index 000000000..149f39215 --- /dev/null +++ b/src/ligo/ligo_multifix/user.ml @@ -0,0 +1,10 @@ +let () = + (match Array.length Sys.argv with + | 1 -> exit 1 + | _ -> ()) ; + let path = Sys.argv.(1) in + let chan = open_in path in + let lexbuf = Lexing.from_channel chan in + let _ast = Parser.entry_point Lex.Lexer.token lexbuf in + Format.printf "parse ok\n" ; + () diff --git a/src/ligo/ligo-parser/.Lexer.ml.tag b/src/ligo/ligo_parser/.Lexer.ml.tag similarity index 100% rename from src/ligo/ligo-parser/.Lexer.ml.tag rename to src/ligo/ligo_parser/.Lexer.ml.tag diff --git a/src/ligo/ligo-parser/.LexerMain.tag b/src/ligo/ligo_parser/.LexerMain.tag similarity index 100% rename from src/ligo/ligo-parser/.LexerMain.tag rename to src/ligo/ligo_parser/.LexerMain.tag diff --git a/src/ligo/ligo-parser/.Parser.mly.tag b/src/ligo/ligo_parser/.Parser.mly.tag similarity index 100% rename from src/ligo/ligo-parser/.Parser.mly.tag rename to src/ligo/ligo_parser/.Parser.mly.tag diff --git a/src/ligo/ligo-parser/.ParserMain.tag b/src/ligo/ligo_parser/.ParserMain.tag similarity index 100% rename from src/ligo/ligo-parser/.ParserMain.tag rename to src/ligo/ligo_parser/.ParserMain.tag diff --git a/src/ligo/ligo-parser/.gitignore b/src/ligo/ligo_parser/.gitignore similarity index 100% rename from src/ligo/ligo-parser/.gitignore rename to src/ligo/ligo_parser/.gitignore diff --git a/src/ligo/ligo-parser/.gitlab-ci.yml b/src/ligo/ligo_parser/.gitlab-ci.yml similarity index 100% rename from src/ligo/ligo-parser/.gitlab-ci.yml rename to src/ligo/ligo_parser/.gitlab-ci.yml diff --git a/src/ligo/ligo-parser/.links b/src/ligo/ligo_parser/.links similarity index 100% rename from src/ligo/ligo-parser/.links rename to src/ligo/ligo_parser/.links diff --git a/src/ligo/ligo-parser/AST.ml b/src/ligo/ligo_parser/AST.ml similarity index 100% rename from src/ligo/ligo-parser/AST.ml rename to src/ligo/ligo_parser/AST.ml diff --git a/src/ligo/ligo-parser/AST.mli b/src/ligo/ligo_parser/AST.mli similarity index 100% rename from src/ligo/ligo-parser/AST.mli rename to src/ligo/ligo_parser/AST.mli diff --git a/src/ligo/ligo-parser/Error.mli b/src/ligo/ligo_parser/Error.mli similarity index 100% rename from src/ligo/ligo-parser/Error.mli rename to src/ligo/ligo_parser/Error.mli diff --git a/src/ligo/ligo-parser/EvalOpt.ml b/src/ligo/ligo_parser/EvalOpt.ml similarity index 100% rename from src/ligo/ligo-parser/EvalOpt.ml rename to src/ligo/ligo_parser/EvalOpt.ml diff --git a/src/ligo/ligo-parser/EvalOpt.mli b/src/ligo/ligo_parser/EvalOpt.mli similarity index 100% rename from src/ligo/ligo-parser/EvalOpt.mli rename to src/ligo/ligo_parser/EvalOpt.mli diff --git a/src/ligo/ligo-parser/FQueue.ml b/src/ligo/ligo_parser/FQueue.ml similarity index 100% rename from src/ligo/ligo-parser/FQueue.ml rename to src/ligo/ligo_parser/FQueue.ml diff --git a/src/ligo/ligo-parser/FQueue.mli b/src/ligo/ligo_parser/FQueue.mli similarity index 100% rename from src/ligo/ligo-parser/FQueue.mli rename to src/ligo/ligo_parser/FQueue.mli diff --git a/src/ligo/ligo-parser/LexToken.mli b/src/ligo/ligo_parser/LexToken.mli similarity index 100% rename from src/ligo/ligo-parser/LexToken.mli rename to src/ligo/ligo_parser/LexToken.mli diff --git a/src/ligo/ligo-parser/LexToken.mll b/src/ligo/ligo_parser/LexToken.mll similarity index 100% rename from src/ligo/ligo-parser/LexToken.mll rename to src/ligo/ligo_parser/LexToken.mll diff --git a/src/ligo/ligo-parser/Lexer.mli b/src/ligo/ligo_parser/Lexer.mli similarity index 100% rename from src/ligo/ligo-parser/Lexer.mli rename to src/ligo/ligo_parser/Lexer.mli diff --git a/src/ligo/ligo-parser/Lexer.mll b/src/ligo/ligo_parser/Lexer.mll similarity index 100% rename from src/ligo/ligo-parser/Lexer.mll rename to src/ligo/ligo_parser/Lexer.mll diff --git a/src/ligo/ligo-parser/LexerMain.ml b/src/ligo/ligo_parser/LexerMain.ml similarity index 100% rename from src/ligo/ligo-parser/LexerMain.ml rename to src/ligo/ligo_parser/LexerMain.ml diff --git a/src/ligo/ligo-parser/Markup.ml b/src/ligo/ligo_parser/Markup.ml similarity index 100% rename from src/ligo/ligo-parser/Markup.ml rename to src/ligo/ligo_parser/Markup.ml diff --git a/src/ligo/ligo-parser/Markup.mli b/src/ligo/ligo_parser/Markup.mli similarity index 100% rename from src/ligo/ligo-parser/Markup.mli rename to src/ligo/ligo_parser/Markup.mli diff --git a/src/ligo/ligo-parser/ParToken.mly b/src/ligo/ligo_parser/ParToken.mly similarity index 100% rename from src/ligo/ligo-parser/ParToken.mly rename to src/ligo/ligo_parser/ParToken.mly diff --git a/src/ligo/ligo-parser/Parser.mly b/src/ligo/ligo_parser/Parser.mly similarity index 100% rename from src/ligo/ligo-parser/Parser.mly rename to src/ligo/ligo_parser/Parser.mly diff --git a/src/ligo/ligo-parser/ParserMain.ml b/src/ligo/ligo_parser/ParserMain.ml similarity index 100% rename from src/ligo/ligo-parser/ParserMain.ml rename to src/ligo/ligo_parser/ParserMain.ml diff --git a/src/ligo/ligo-parser/Pos.ml b/src/ligo/ligo_parser/Pos.ml similarity index 100% rename from src/ligo/ligo-parser/Pos.ml rename to src/ligo/ligo_parser/Pos.ml diff --git a/src/ligo/ligo-parser/Pos.mli b/src/ligo/ligo_parser/Pos.mli similarity index 100% rename from src/ligo/ligo-parser/Pos.mli rename to src/ligo/ligo_parser/Pos.mli diff --git a/src/ligo/ligo-parser/Region.ml b/src/ligo/ligo_parser/Region.ml similarity index 100% rename from src/ligo/ligo-parser/Region.ml rename to src/ligo/ligo_parser/Region.ml diff --git a/src/ligo/ligo-parser/Region.mli b/src/ligo/ligo_parser/Region.mli similarity index 100% rename from src/ligo/ligo-parser/Region.mli rename to src/ligo/ligo_parser/Region.mli diff --git a/src/ligo/ligo-parser/Tests/a.ligo b/src/ligo/ligo_parser/Tests/a.ligo similarity index 100% rename from src/ligo/ligo-parser/Tests/a.ligo rename to src/ligo/ligo_parser/Tests/a.ligo diff --git a/src/ligo/ligo-parser/Tests/crowdfunding.ligo b/src/ligo/ligo_parser/Tests/crowdfunding.ligo similarity index 100% rename from src/ligo/ligo-parser/Tests/crowdfunding.ligo rename to src/ligo/ligo_parser/Tests/crowdfunding.ligo diff --git a/src/ligo/ligo-parser/Utils.ml b/src/ligo/ligo_parser/Utils.ml similarity index 100% rename from src/ligo/ligo-parser/Utils.ml rename to src/ligo/ligo_parser/Utils.ml diff --git a/src/ligo/ligo-parser/Utils.mli b/src/ligo/ligo_parser/Utils.mli similarity index 100% rename from src/ligo/ligo-parser/Utils.mli rename to src/ligo/ligo_parser/Utils.mli diff --git a/src/ligo/ligo-parser/check_dot_git_is_dir.sh b/src/ligo/ligo_parser/check_dot_git_is_dir.sh similarity index 100% rename from src/ligo/ligo-parser/check_dot_git_is_dir.sh rename to src/ligo/ligo_parser/check_dot_git_is_dir.sh diff --git a/src/ligo/ligo-parser/dune b/src/ligo/ligo_parser/dune similarity index 97% rename from src/ligo/ligo-parser/dune rename to src/ligo/ligo_parser/dune index 29154a231..4eaa63a36 100644 --- a/src/ligo/ligo-parser/dune +++ b/src/ligo/ligo_parser/dune @@ -8,7 +8,7 @@ (library (name ligo_parser) - (public_name ligo-parser) + (public_name ligo.parser) (modules_without_implementation Error) (libraries getopt hex str uutf zarith)) diff --git a/src/ligo/ligo-parser/ligo_parser.ml b/src/ligo/ligo_parser/ligo_parser.ml similarity index 100% rename from src/ligo/ligo-parser/ligo_parser.ml rename to src/ligo/ligo_parser/ligo_parser.ml diff --git a/src/ligo/rope.ml b/src/ligo/rope/rope.ml similarity index 100% rename from src/ligo/rope.ml rename to src/ligo/rope/rope.ml diff --git a/src/ligo/rope.mli b/src/ligo/rope/rope.mli similarity index 100% rename from src/ligo/rope.mli rename to src/ligo/rope/rope.mli diff --git a/src/ligo/rope_implementation.ml b/src/ligo/rope/rope_implementation.ml similarity index 100% rename from src/ligo/rope_implementation.ml rename to src/ligo/rope/rope_implementation.ml diff --git a/src/ligo/rope_implementation.mli b/src/ligo/rope/rope_implementation.mli similarity index 100% rename from src/ligo/rope_implementation.mli rename to src/ligo/rope/rope_implementation.mli diff --git a/src/ligo/rope_test.ml b/src/ligo/rope/rope_test.ml similarity index 100% rename from src/ligo/rope_test.ml rename to src/ligo/rope/rope_test.ml diff --git a/src/ligo/rope_top_level_open.ml b/src/ligo/rope/rope_top_level_open.ml similarity index 100% rename from src/ligo/rope_top_level_open.ml rename to src/ligo/rope/rope_top_level_open.ml diff --git a/src/ligo/rope_top_level_open.mli b/src/ligo/rope/rope_top_level_open.mli similarity index 100% rename from src/ligo/rope_top_level_open.mli rename to src/ligo/rope/rope_top_level_open.mli