-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrule_parser_human.py
79 lines (64 loc) · 2.15 KB
/
rule_parser_human.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from lark import Lark
from human import *
parser= Lark(r"""
STRING: /[a-zA-Z_]\w*/
NUMBER: /[0-9_]\w*/
COMMENT: /#[^\n]*/
ruleset: (rule)* (event)*
rule: body "->" effects
body: _beliefs [ _goals ]
_beliefs: [belief ("," belief)*]
belief: STRING
_goals: "!"goal ("," goal)*
goal: STRING
effects: [_effect ("," _effect)*]
_effect: addbelief | rembelief | addgoal | remgoal | action
action: "."STRING
addbelief: "+"belief
rembelief: "-"belief
addgoal: "+!"goal
remgoal: "-!"goal
event: NUMBER ":" _effect
%import common.WS
%ignore WS
%ignore COMMENT
""",start='ruleset')
def readfile(filename):
ruleset=[]
events={}
with open(filename,'r') as myfile:
data=myfile.read()
o=parser.parse(data)
for r in o.find_data("rule"):
beliefs=set()
goals=set()
effects=set()
body=list(r.find_data("body"))[0]
for belief in body.find_data("belief"):
beliefs.add(belief.children[0].value)
for goal in body.find_data("goal"):
goals.add(goal.children[0].value)
for a in r.find_data("addbelief"):
effects.add(AddBelief(a.children[0].children[0].value))
for a in r.find_data("addgoal"):
effects.add(AddGoal(a.children[0].children[0].value))
for a in r.find_data("rembelief"):
effects.add(RemoveBelief(a.children[0].children[0].value))
for a in r.find_data("remgoal"):
effects.add(RemoveGoal(a.children[0].children[0].value))
for a in r.find_data("action"):
effects.add(ExecuteAction(a.children[0].value))
ruleset.append(Rule(beliefs,goals,effects))
for e in o.find_data("event"):
time=int(e.children[0])
if events.get(time)==None:
events[time]=set()
if e.children[1].data=="addbelief":
events[time].add(AddBelief(e.children[1].children[0].children[0].value))
if e.children[1].data=="addgoal":
events[time].add(AddGoal(e.children[1].children[0].children[0].value))
if e.children[1].data=="rembelief":
events[time].add(RemoveBelief(e.children[1].children[0].children[0].value))
if e.children[1].data=="remgoal":
events[time].add(RemoveGoal(e.children[1].children[0].children[0].value))
return (ruleset,events)