43 lines
1.2 KiB
Plaintext
43 lines
1.2 KiB
Plaintext
import "./ioutil" for FileUtil, File
|
|
import "./pattern" for Pattern
|
|
|
|
var lb = FileUtil.lineBreak
|
|
|
|
/* rulesets assumed to be separated by a blank line in file */
|
|
var readRules = Fn.new { |path|
|
|
return File.read(path).trimEnd().split("%(lb)%(lb)").map { |rs| rs.split(lb) }.toList
|
|
}
|
|
|
|
/* tests assumed to be on consecutive lines */
|
|
var readTests = Fn.new { |path| File.read(path).trimEnd().split(lb) }
|
|
|
|
var rules = readRules.call("markov_rules.txt")
|
|
var tests = readTests.call("markov_tests.txt")
|
|
var pattern = Pattern.new("+0/s[~.][+0/z]", Pattern.start)
|
|
var ix = 0
|
|
for (origTest in tests) {
|
|
var captures = []
|
|
for (rule in rules[ix]) {
|
|
if (rule.startsWith("#")) continue
|
|
var splits = rule.split(" -> ")
|
|
var m = pattern.find(splits[1])
|
|
if (m) captures.add([splits[0].trimEnd()] + m.capsText)
|
|
}
|
|
var test = origTest
|
|
while (true) {
|
|
var copy = test
|
|
var redo = false
|
|
for (c in captures) {
|
|
test = test.replace(c[0], c[2])
|
|
if (c[1] == ".") break
|
|
if (test != copy) {
|
|
redo = true
|
|
break
|
|
}
|
|
}
|
|
if (!redo) break
|
|
}
|
|
System.print("%(origTest)\n%(test)\n")
|
|
ix = ix + 1
|
|
}
|