You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.8 KiB
Python

"""
Michael Murtaugh
Following Charles Hayden's 1990's interpretation implemented in Java
(C) 2018 and released under the Free Art License 1.3
See LICENSE.txt and http://artlibre.org/licence/lal/en/
For use with eliza.js
Usage:
python3 eliza_script_to_json.py < doctor.txt > doctor.json
"""
import sys, json
output = {}
output['pre'] = pre = []
output['post'] = post = []
output['synon'] = synon = []
output['quit'] = quit = []
output['keywords'] = keys = []
for line in sys.stdin:
line = line.strip()
if line.startswith("#") or not line:
continue
cmd, rest = line.split(" ", 1)
cmd = cmd.strip()
rest = rest.strip()
if cmd == "initial:":
output['initial'] = rest
elif cmd == "final:":
output['final'] = rest
elif cmd == "pre:":
pre.append(rest)
elif cmd == "post:":
post.append(rest)
elif cmd == "synon:":
synon.append(rest)
elif cmd == "key:":
try:
token, weight = rest.split()
except ValueError:
token = rest.strip()
weight = 0
print ("key", token, int(weight), file=sys.stderr)
keys.append({"token": token.strip(), "weight": int(weight), "rules": []})
elif line.startswith("decomp:"):
_, pattern = line.split(" ", 1)
pattern = pattern.strip()
if pattern.startswith("$"):
decomp = {"decomp": pattern[1:].strip(), "reasmb": [], "save": True}
else:
decomp = {"decomp": pattern, "reasmb": []}
print ("decomp", decomp, file=sys.stderr)
keys[-1]['rules'].append(decomp)
elif line.startswith("reasmb:"):
_, pattern = line.split(" ", 1)
print ("reasmb", pattern, file=sys.stderr)
keys[-1]['rules'][-1]['reasmb'].append(pattern.strip())
print (json.dumps(output, indent=2))