@property
def span(self):
- if self.init or self.query:
- span = parse_attrs(self.init or self.query)['Span']
- return hide_ugly_filename(span)
+ span = parse_attrs(self.init or self.query)['Span']
+ return hide_ugly_filename(span)
@property
def src(self):
- if self.init or self.query:
- return strip_comments(parse_attrs(self.init or self.query)['rule'])
+ return strip_comments(parse_attrs(self.init or self.query)['rule'])
def __repr__(self):
return 'Rule(%s, %r)' % (self.index, self.src)
self.new_fn(k, v)
new_rules = set()
- for _, r, _ in env.queries:
+ for fn, r, h in env.queries:
+ self.new_query(fn, r, h)
new_rules.add(r)
- for r, _ in env.initializers:
+ for fn, r, h in env.updaters:
+ self.new_updater(fn, r, h)
+ for r, h in env.initializers:
+ self.new_initializer(r, h)
new_rules.add(r)
self.new_rules = new_rules
- for fn, r, h in env.queries:
- self.new_query(fn, r, h)
-
try:
if initialize:
- # only run new initializers
+ # run new initializers
for _, init in env.initializers:
init(emit=_emit)
except (TypeError, ZeroDivisionError) as e:
- raise DynaInitializerException(e, init)
+ # remove new rules
+ for r in new_rules:
+ self.retract_rule(r)
+ self.new_rules = set()
- finally:
+ # if multiple rules were added we reject all of them (in order to
+ # avoid an bizarre parser state.
+ raise DynaInitializerException(e, init)
+
+ else:
# process emits
for e in emits:
self.emit(*e, delete=False)
- for fn, r, h in env.updaters:
- self.new_updater(fn, r, h)
- for r, h in env.initializers:
- self.new_initializer(r, h)
-
# accept the new parser state
self.parser_state = env.parser_state
-
# ------ $rule for fun and profit -------
interp = self
def rule(ix, *a):
+++ /dev/null
-
-> b := 0.
-| a += 1/b.
-|
-| c += "" + b.
-|
-| e := 0.
-|
-| b := e/0.
-| a += e/0.
-|
-| d += null.
-| d += 1.
-|
-| a(X) := f(X,Y).
-|
-| f(1,1) := 1.
-| f(1,2) := 2.
-|
-| f(2,1) := 1.
-| f(2,2) := 2.
-
-Changes
-=======
-a(1) = $error.
-a(2) = $error.
-b = 0.
-d = $error.
-e = 0.
-f(1,1) = 1.
-f(1,2) = 2.
-f(2,1) = 1.
-f(2,2) = 2.
-
-> sol
-
-Solution
-========
-b = 0.
-d = $error.
-e = 0.
-
-a/1
-===
-a(1) = $error.
-a(2) = $error.
-
-f/2
-===
-f(1,1) = 1.
-f(1,2) = 2.
-f(2,1) = 1.
-f(2,2) = 2.
-
-Errors
-======
-Error(s) aggregating a/1:
- AggregatorError:
- `a(1)`: `:=` got conflicting values [1, 2] for rule index 8
- `a(2)`: `:=` got conflicting values [1, 2] for rule index 8
-Error(s) aggregating d/0:
- TypeError:
- `d`: unsupported operand type(s) for *: 'NoneType' and 'int'
-Error(s) in rule: <repl>
- a += 1/b.
- ZeroDivisionError:
- when `b` = 0
- division by zero
-Error(s) in rule: <repl>
- c += "" + b.
- TypeError:
- when `b` = 0
- cannot concatenate 'str' and 'int' objects
-Error(s) in rule: <repl>
- b := e/0.
- ZeroDivisionError:
- when `e` = 0
- division by zero
-Error(s) in rule: <repl>
- a += e/0.
- ZeroDivisionError:
- when `e` = 0
- division by zero