Further streamlining PascaLIGO and Ligodity parsers.

This commit is contained in:
Christian Rinderknecht 2019-07-25 16:11:33 +02:00
parent 2a44e0f084
commit 295f94a09a
2 changed files with 69 additions and 121 deletions

View File

@ -3,47 +3,8 @@
open AST
(* Rewrite "let pattern = e" as "let x = e;; let x1 = ...;; let x2 = ...;;" *)
(*
module VMap = Utils.String.Map
let ghost_of value = Region.{region=ghost; value}
*)
let ghost = Region.ghost
(* let fail_syn_unif type1 type2 : 'a =
let reg = AST.region_of_type_expr type1 in
let reg = reg#compact ~file:false `Byte in
let value =
Printf.sprintf "Unification with %s is not\
implemented." reg in
let region = AST.region_of_type_expr type2 in
let err = Region.{value; region} in
(Lexer.prerr ~kind:"Syntactical" err; exit 1)
let mk_component rank =
let num = string_of_int rank, Z.of_int rank in
let par = {lpar=ghost; inside = ghost_of num; rpar=ghost}
in Component (ghost_of par)
let rec mk_field_path (rank, tail) =
let head = mk_component rank in
match tail with
[] -> head, []
| hd::tl -> mk_field_path (hd,tl) |> Utils.nsepseq_cons head ghost
let mk_projection fresh (path : int Utils.nseq) = {
struct_name = fresh;
selector = ghost;
field_path = Utils.nsepseq_rev (mk_field_path path)
} *)
(* We rewrite "fun p -> e" into "fun x -> match x with p -> e" *)
(* END HEADER *)
%}
@ -53,7 +14,6 @@ let rec mk_field_path (rank, tail) =
%start program interactive_expr
%type <AST.t> program
%type <AST.expr> interactive_expr
(*%type <('item,'sep) sep_or_term_list> sep_or_term_list*)
%%

View File

@ -21,33 +21,22 @@ open AST
(* RULES *)
(* The rule [series(Item,TERM)] parses a non-empty list of [Item]
separated by semicolons and optionally terminated by a semicolon,
then the terminal TERM. *)
(* The rule [sep_or_term(item,sep)] ("separated or terminated list")
parses a non-empty list of items separated by [sep], and optionally
terminated by [sep]. *)
series(Item,TERM):
Item after_item(Item,TERM) { $1,$2 }
after_item(Item,TERM):
SEMI item_or_closing(Item,TERM) {
match $2 with
`Some (item, items, term, closing) ->
($1, item)::items, term, closing
| `Closing closing ->
[], Some $1, closing
}
| TERM {
[], None, $1
}
item_or_closing(Item,TERM):
TERM {
`Closing $1
}
| series(Item,TERM) {
let item, (items, term, closing) = $1
in `Some (item, items, term, closing)
sep_or_term_list(item,sep):
nsepseq(item,sep) {
$1, None
}
| nseq(item sep {$1,$2}) {
let (first,sep), tail = $1 in
let rec trans (seq, prev_sep as acc) = function
[] -> acc
| (item,next_sep)::others ->
trans ((prev_sep,item)::seq, next_sep) others in
let list, term = trans ([],sep) tail
in (first, List.rev list), Some term }
(* Compound constructs *)
@ -220,24 +209,24 @@ variant:
{region=$1.region; value= {constr=$1; args=None}} }
record_type:
Record series(field_decl,End) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing
Record sep_or_term_list(field_decl,SEMI) End {
let elements, terminator = $2 in
let region = cover $1 $3
and value = {
opening = Kwd $1;
elements = Some (first, others);
elements = Some elements;
terminator;
closing = End closing}
closing = End $3}
in {region; value}
}
| Record LBRACKET series(field_decl,RBRACKET) {
let first, (others, terminator, closing) = $3 in
let region = cover $1 closing
| Record LBRACKET sep_or_term_list(field_decl,SEMI) RBRACKET {
let elements, terminator = $3 in
let region = cover $1 $4
and value = {
opening = KwdBracket ($1,$2);
elements = Some (first, others);
elements = Some elements;
terminator;
closing = RBracket closing}
closing = RBracket $4}
in {region; value} }
field_decl:
@ -369,24 +358,24 @@ param_type:
cartesian { TProd $1 }
block:
Begin series(statement,End) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing
Begin sep_or_term_list(statement,SEMI) End {
let statements, terminator = $2 in
let region = cover $1 $3
and value = {
opening = Begin $1;
statements = first, others;
statements;
terminator;
closing = End closing}
closing = End $3}
in {region; value}
}
| Block LBRACE series(statement,RBRACE) {
let first, (others, terminator, closing) = $3 in
let region = cover $1 closing
| Block LBRACE sep_or_term_list(statement,SEMI) RBRACE {
let statements, terminator = $3 in
let region = cover $1 $4
and value = {
opening = Block ($1,$2);
statements = first, others;
statements;
terminator;
closing = Block closing}
closing = Block $4}
in {region; value}}
statement:
@ -523,14 +512,14 @@ map_patch:
in {region; value}}
injection(Kind,element):
Kind series(element,End) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing
Kind sep_or_term_list(element,SEMI) End {
let elements, terminator = $2 in
let region = cover $1 $3
and value = {
opening = Kwd $1;
elements = Some (first, others);
elements = Some elements;
terminator;
closing = End closing}
closing = End $3}
in {region; value}
}
| Kind End {
@ -542,14 +531,14 @@ injection(Kind,element):
closing = End $2}
in {region; value}
}
| Kind LBRACKET series(element,RBRACKET) {
let first, (others, terminator, closing) = $3 in
let region = cover $1 closing
| Kind LBRACKET sep_or_term_list(element,SEMI) RBRACKET {
let elements, terminator = $3 in
let region = cover $1 $4
and value = {
opening = KwdBracket ($1,$2);
elements = Some (first, others);
elements = Some elements;
terminator;
closing = RBracket closing}
closing = RBracket $4}
in {region; value}
}
| Kind LBRACKET RBRACKET {
@ -562,14 +551,14 @@ injection(Kind,element):
in {region; value}}
map_injection:
Map series(binding,End) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing
Map sep_or_term_list(binding,SEMI) End {
let elements, terminator = $2 in
let region = cover $1 $3
and value = {
opening = Kwd $1;
elements = Some (first, others);
elements = Some elements;
terminator;
closing = End closing}
closing = End $3}
in {region; value}
}
| Map End {
@ -581,14 +570,14 @@ map_injection:
closing = End $2}
in {region; value}
}
| Map LBRACKET series(binding,RBRACKET) {
let first, (others, terminator, closing) = $3 in
let region = cover $1 closing
| Map LBRACKET sep_or_term_list(binding,SEMI) RBRACKET {
let elements, terminator = $3 in
let region = cover $1 $4
and value = {
opening = KwdBracket ($1,$2);
elements = Some (first, others);
elements = Some elements;
terminator;
closing = RBracket closing}
closing = RBracket $4}
in {region; value}
}
| Map LBRACKET RBRACKET {
@ -647,13 +636,12 @@ if_clause:
instruction {
ClauseInstr $1
}
| LBRACE series(statement,RBRACE) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing in
| LBRACE sep_or_term_list(statement,COMMA) RBRACE {
let region = cover $1 $3 in
let value = {
lbrace = $1;
inside = (first, others), terminator;
rbrace = closing} in
inside = $2;
rbrace = $3} in
ClauseBlock {value; region} }
case_instr:
@ -997,24 +985,24 @@ selection:
| Int { Component $1 }
record_expr:
Record series(field_assignment,End) {
let first, (others, terminator, closing) = $2 in
let region = cover $1 closing
Record sep_or_term_list(field_assignment,SEMI) End {
let elements, terminator = $2 in
let region = cover $1 $3
and value = {
opening = Kwd $1;
elements = Some (first, others);
elements = Some elements;
terminator;
closing = End closing}
closing = End $3}
in {region; value}
}
| Record LBRACKET series(field_assignment,RBRACKET) {
let first, (others, terminator, closing) = $3 in
let region = cover $1 closing
| Record LBRACKET sep_or_term_list(field_assignment,SEMI) RBRACKET {
let elements, terminator = $3 in
let region = cover $1 $4
and value = {
opening = KwdBracket ($1,$2);
elements = Some (first, others);
elements = Some elements;
terminator;
closing = RBracket closing}
closing = RBracket $4}
in {region; value} }
field_assignment: