Expr.expr --- associativity

This commit is contained in:
Dmitry Boulytchev 2020-01-31 01:30:03 +03:00
parent b4ba38a0f7
commit 4c031ce95f
11 changed files with 98 additions and 17 deletions

View file

@ -22,9 +22,10 @@ public fun right (f) {
fun altl (level) { fun altl (level) {
case level of case level of
[assoc, ps] -> [assoc, ps] ->
local assfun = case assoc of Left -> left | Right -> right | Nona -> left esac;
case map (fun (p) { case map (fun (p) {
case p of case p of
[op, sema] -> op @ lift(assoc (sema)) [op, sema] -> op @ lift(assfun (sema))
esac esac
}, ps) of }, ps) of
p : ps -> foldl (infix |, p, ps) p : ps -> foldl (infix |, p, ps)
@ -39,14 +40,24 @@ public fun expr (ops, opnd) {
| level : tl -> | level : tl ->
local lops = altl (level), local lops = altl (level),
next = inner (tl); next = inner (tl);
fun this (c) {
next (id) |> fun (l) {lops |> fun (op) {this (op (c, l))}}
| next (id) @ c
-- $ k
}
this case level.fst of
Nona ->
fun this (c) {
next (id) |> fun (l) {lops |> fun (op) {next (id) @ fun (r) {c (op)(id, l)(r)}}}
| next (id) @ c
}
this
| _ ->
fun this (c) {
next (id) |> fun (l) {lops |> fun (op) {this (op (c, l))}}
| next (id) @ c
}
this
esac
esac esac
} }

View file

@ -4,27 +4,27 @@ import Ref;
import Fun; import Fun;
import Matcher; import Matcher;
local tab, hct, log = false; local tab, hct, restab, log = false;
public fun logOn () { public fun logOn () {
log := true log := true
} }
public fun initOstap () { public fun initOstap () {
tab := ref (emptyHashTab ()); tab := ref (emptyHashTab ());
hct := emptyMemo () restab := emptyMemo ();
hct := emptyMemo ()
} }
public fun memo (f) { public fun memo (f) {
local t;
f := lookupMemo (hct, f); f := lookupMemo (hct, f);
if log then printf ("Memoizing: %x=%s\n", f, f.string) fi; if log then printf ("Memoizing: %x=%s\n", f, f.string) fi;
case findHashTab (deref (tab), f) of case findHashTab (deref (tab), f) of
None -> if log then printf ("new table...\n") fi; t := ref (emptyMap ()); tab ::= addHashTab (deref (tab), f, t) None -> if log then printf ("new table...\n") fi;
| Some (tt) -> t := tt tab ::= addHashTab (deref (tab), f, ref (emptyMap ()))
| Some (tt) -> skip
esac; esac;
fun (k) { fun (k) {
@ -35,6 +35,7 @@ public fun memo (f) {
None -> None ->
t ::= addMap (deref (t), s, [addSet (emptySet (), k), emptySet ()]); t ::= addMap (deref (t), s, [addSet (emptySet (), k), emptySet ()]);
f (fun (r) { f (fun (r) {
r := lookupMemo (restab, r);
if log then printf ("Running continuation with result %s\n", r.string) fi; if log then printf ("Running continuation with result %s\n", r.string) fi;
case findMap (deref (t), s) of case findMap (deref (t), s) of
Some ([ks, rs]) -> Some ([ks, rs]) ->

View file

@ -0,0 +1,3 @@
Succ (Add ("a", Sub ("a", "a")))
Succ (Mul (Div (Mul ("a", "a"), "a"), "a"))
Succ (Add (Mul ("a", "a"), Sub (Div ("a", "a"), Mul ("a", "a"))))

View file

@ -0,0 +1,3 @@
Succ (Add ("a", Sub ("a", "a")))
Succ (Mul (Div (Mul ("a", "a"), "a"), "a"))
Succ (Add (Mul ("a", "a"), Sub (Div ("a", "a"), Mul ("a", "a"))))

View file

@ -0,0 +1,4 @@
Succ (Eq ("a", "a"))
Succ (Eq (Mul ("a", "a"), Mul ("a", "a")))
Succ (Eq (Add (Mul ("a", "a"), Sub (Div ("a", "a"), Mul ("a", "a"))), Sub (Mul ("a", "a"), "a")))
Fail ({""*" expected at"}, 1, 2)

View file

@ -0,0 +1,12 @@
import Ostap;
import Matcher;
local a = token ("a"), acc;
initOstap ();
printf ("Parsing a*| against ""aa""... %s\n", parseString (rep0 (a) |> fun (x) {eof @ lift (x)}, "aa").string);
printf ("Parsing a+| against ""aa""... %s\n", parseString (rep (a) |> fun (x) {eof @ lift (x)}, "aa").string);
printf ("Parsing list(a)| against ""a""... %s\n", parseString (list (a) |> bypass (eof), "a").string);
printf ("Parsing list(a)| against ""a,a""... %s\n", parseString (list (a) |> bypass (eof), "a,a").string);
printf ("Parsing list0(a)| against """"... %s\n", parseString (list0 (a) |> bypass (eof), "").string)

View file

@ -7,7 +7,7 @@ local a = token ("a"),
sub = [token ("-"), fun (l, r) {Sub (l, r)}], sub = [token ("-"), fun (l, r) {Sub (l, r)}],
mul = [token ("*"), fun (l, r) {Mul (l, r)}], mul = [token ("*"), fun (l, r) {Mul (l, r)}],
div = [token ("/"), fun (l, r) {Div (l, r)}], div = [token ("/"), fun (l, r) {Div (l, r)}],
exp = expr ({[left, {add, sub}], [left, {mul, div}]}, a) (id); exp = expr ({[Left, {add, sub}], [Left, {mul, div}]}, a) (id);
printf ("%s\n", parseString (exp |> bypass (eof), "a").string); printf ("%s\n", parseString (exp |> bypass (eof), "a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a+a").string); printf ("%s\n", parseString (exp |> bypass (eof), "a+a").string);

View file

@ -14,7 +14,7 @@ local a = token ("a"),
sub = [token ("-"), fun (l, r) {Sub (l, r)}], sub = [token ("-"), fun (l, r) {Sub (l, r)}],
mul = [token ("*"), fun (l, r) {Mul (l, r)}], mul = [token ("*"), fun (l, r) {Mul (l, r)}],
div = [token ("/"), fun (l, r) {Div (l, r)}], div = [token ("/"), fun (l, r) {Div (l, r)}],
exp = expr ({[left, {add, sub}], [left, {mul, div}]}, a) (id), exp = expr ({[Left, {add, sub}], [Left, {mul, div}]}, a) (id),
i; i;
printf ("%s\n", parseString (exp |> bypass (eof), gen (10)).string) printf ("%s\n", parseString (exp |> bypass (eof), gen (10)).string)

View file

@ -0,0 +1,14 @@
import Ostap;
import Expr;
import Fun;
local a = token ("a"),
add = [token ("+"), fun (l, r) {Add (l, r)}],
sub = [token ("-"), fun (l, r) {Sub (l, r)}],
mul = [token ("*"), fun (l, r) {Mul (l, r)}],
div = [token ("/"), fun (l, r) {Div (l, r)}],
exp = expr ({[Right, {add, sub}], [Left, {mul, div}]}, a) (id);
printf ("%s\n", parseString (exp |> bypass (eof), "a+a-a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a/a*a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a+a/a-a*a").string)

View file

@ -0,0 +1,16 @@
import Ostap;
import Expr;
import Fun;
import List;
local a = token ("a"),
eq = [token ("="), fun (l, r) {Eq (l, r)}],
add = [token ("+"), fun (l, r) {Add (l, r)}],
sub = [token ("-"), fun (l, r) {Sub (l, r)}],
mul = [token ("*"), fun (l, r) {Mul (l, r)}],
div = [token ("/"), fun (l, r) {Div (l, r)}],
exp = expr ({[Nona, singleton (eq)], [Right, {add, sub}], [Left, {mul, div}]}, a) (id);
printf ("%s\n", parseString (exp |> bypass (eof), "a+a-a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a/a*a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a+a/a-a*a").string)

View file

@ -0,0 +1,17 @@
import Ostap;
import Expr;
import Fun;
import List;
local a = token ("a"),
eq = [token ("="), fun (l, r) {Eq (l, r)}],
add = [token ("+"), fun (l, r) {Add (l, r)}],
sub = [token ("-"), fun (l, r) {Sub (l, r)}],
mul = [token ("*"), fun (l, r) {Mul (l, r)}],
div = [token ("/"), fun (l, r) {Div (l, r)}],
exp = expr ({[Nona, singleton (eq)], [Right, {add, sub}], [Left, {mul, div}]}, a) (id);
printf ("%s\n", parseString (exp |> bypass (eof), "a=a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a=a*a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a*a+a/a-a*a=a*a-a").string);
printf ("%s\n", parseString (exp |> bypass (eof), "a=a=a+a").string)