Skip to content

Commit

Permalink
Finish RxOp
Browse files Browse the repository at this point in the history
  • Loading branch information
sorear committed Jun 3, 2012
1 parent 7b23bf5 commit fb31c9b
Show file tree
Hide file tree
Showing 3 changed files with 435 additions and 7 deletions.
2 changes: 1 addition & 1 deletion lib/CClass.cs
Expand Up @@ -3,7 +3,7 @@

namespace Niecza.Compiler {
class CClass {
int[] terms;
internal int[] terms;

public CClass(params int[] terms) { this.terms = terms; }

Expand Down
44 changes: 43 additions & 1 deletion lib/Op.cs
Expand Up @@ -968,7 +968,49 @@ class LetVar : Op {
protected override CgOp code(SubInfo body) { return CgOp.letvar(name); }
}

// punt on regexbody for now
class RegexBody : Op {
string name;
RxOp.RxOp rxop;
Op[] pre;
bool passcut, canback;

public RegexBody(Cursor c, string na, RxOp.RxOp rx, Op[] p, bool cut,
bool back) : base(c) {
name=na; rxop=rx; pre=p; passcut=cut; canback=back;
}

public override Op VisitOps(Func<Op,Op> post) {
for (int i = 0; i < pre.Length; i++)
pre[i] = pre[i].VisitOps(post);
rxop.VisitOps(post);
return post(this);
}

protected override CgOp code(SubInfo body) {
var mcaps = new List<string>();
var capdict = new Dictionary<string,int>();
rxop.used_caps(1, capdict);
foreach (var kv in capdict)
if (kv.Value >= 2) mcaps.Add(kv.Key);

var ops = new List<object>();
foreach (var p in pre)
ops.Add(CgOp.sink(p.cgop(body)));
ops.Add(CgOp.rxinit(CgOp.str(name), CgOp.cast("cursor",
CgOp.fetch(CgOp.scopedlex("self"))), passcut?1:0));
ops.Add(CgOp.rxpushcapture(CgOp.@null("var"), mcaps.ToArray()));
rxop.code(body, ops);
if (body.dylex.ContainsKey("$*GOAL"))
ops.Insert(0, CgOp.scopedlex("$*GOAL",
CgOp.context_get("$*GOAL", 1)));
ops.Add(canback ? CgOp.rxend() : CgOp.rxfinalend());
ops.Add(CgOp.label("backtrack"));
ops.Add(CgOp.rxbacktrack());
ops.Add(CgOp.@null("var"));
return CgOp.prog(ops.ToArray());
}
}

class YouAreHere : Op {
string unitname;
public YouAreHere(Cursor c, string u) : base(c) { unitname = u; }
Expand Down

0 comments on commit fb31c9b

Please sign in to comment.