| # Translating Prolog into WAM-based Intermediate Code |
| def pl2am(name, src, out): |
| srcs = [ |
| "src/compiler/package_fx.pl", |
| "src/compiler/pl2am.pl", |
| "src/builtin/system.pl", |
| ] |
| if not src in srcs: |
| srcs.append(src) |
| native.genrule( |
| name = name, |
| srcs = srcs, |
| cmd = " && ".join([ |
| "ROOT=$$PWD", |
| "TMP=$$(mktemp -d || mktemp -d -t bazel-tmp)", |
| 'echo "go :- ' + |
| "load_files([" + |
| "'$$ROOT/src/compiler/package_fx.pl'," + |
| "'$$ROOT/src/builtin/system.pl'," + |
| "'$$ROOT/src/compiler/pl2am.pl'" + |
| "])," + |
| "pl2am([" + |
| "'$$(basename %s)'," % src + |
| "'$$ROOT/$@'," + |
| "[ed,ac,ie,rc,idx]" + |
| "])." + |
| '">$$TMP/go.pl', |
| "cd $$(dirname %s)" % src, |
| 'swipl --traditional --quiet -g go,halt -t "halt(1)" $$TMP/go.pl', |
| ]), |
| outs = [out], |
| ) |
| |
| # Translating WAM-based Intermediate Code into Java |
| def am2j(name, am, out): |
| native.genrule( |
| name = name, |
| srcs = [ |
| am, |
| "src/compiler/am2j.pl", |
| ], |
| cmd = " && ".join([ |
| "ROOT=$$PWD", |
| "TMP=$$(mktemp -d || mktemp -d -t bazel-tmp)", |
| 'echo "go :- ' + |
| "load_files([" + |
| "'src/compiler/am2j.pl'" + |
| "])," + |
| "am2j([" + |
| "'$(location %s)'," % am + |
| "'$$TMP/java'" + |
| "])." + |
| '">$$TMP/go.pl', |
| "mkdir $$TMP/java", |
| 'swipl --traditional --quiet -g go,halt -t "halt(1)" $$TMP/go.pl', |
| "cd $$TMP/java", |
| "zip -qr $$ROOT/$@ .", |
| ]), |
| outs = [out], |
| ) |
| |
| def pl2j(name, src, out): |
| pl2am( |
| name = name + "_rule.am", |
| src = src, |
| out = name + ".am", |
| ) |
| am2j( |
| name = name, |
| am = ":" + name + "_rule.am", |
| out = out, |
| ) |