Skip to content

Commit

Permalink
clean code: better name and inlined lr_answer
Browse files Browse the repository at this point in the history
  • Loading branch information
xli committed Aug 18, 2011
1 parent 50f76cb commit a762306
Showing 1 changed file with 17 additions and 34 deletions.
51 changes: 17 additions & 34 deletions lib/parslet/atoms/rule.rb
Original file line number Diff line number Diff line change
@@ -1,32 +1,32 @@

class Parslet::Atoms::Rule < Parslet::Atoms::Entity
class MemoEntry < Struct.new(:ans, :pos)
class MemoEntry < Struct.new(:answer, :pos)
def error?
self.ans.error?
self.answer.error?
end

def result(lr_stack)
if self.ans.is_a?(LR)
self.ans.setup_lr(lr_stack)
self.ans.ans
if self.answer.is_a?(LR)
self.answer.setup_lr(lr_stack)
self.answer.answer
else
self.ans
self.answer
end
end
end

class LR < Struct.new(:rule, :seed, :head, :next)
class Error < RuntimeError; end

def detected?
!self.head.nil?
def head_rule?(rule)
self.head && self.head.rule == rule
end

def error?
detected?
!self.head.nil?
end

def ans
def answer
raise Error.new('left recursion detected') if seed.nil?
seed
end
Expand All @@ -48,7 +48,7 @@ class Head < Struct.new(:rule, :involved_rules, :eval_rules)
def involved?(rule)
self.rule == rule || self.involved_rules.include?(rule)
end
def evaluated?(rule)
def eval?(rule)
eval_rules.include?(rule)
end
end
Expand Down Expand Up @@ -92,35 +92,18 @@ def eval_rule_body_with_lr_support
lr = LR.new(rule)
push_into_lr_stack(lr)
self.entry = MemoEntry.new lr, self.pos
eval_result = eval_rule_body
self.entry = eval_rule_body
pop_lr_stack
self.entry.pos = eval_result.pos
if lr.detected?
lr.seed = eval_result.ans
lr_answer
else
self.entry = eval_result
if lr.head_rule?(rule) && !self.entry.error?
grow_lr(lr.head)
end
self.entry
end

def lr_answer
h = self.entry.ans.head
if h.rule != rule
self.entry.ans = self.entry.ans.seed
else
self.entry.ans = self.entry.ans.seed
unless self.entry.error?
grow_lr(h)
end
self.entry
end
end

def eval_rule_body
rewind
ans = rule.eval_rule_body(source, context)
MemoEntry.new(ans, source.pos)
answer = rule.eval_rule_body(source, context)
MemoEntry.new(answer, source.pos)
end

def recall
Expand All @@ -135,7 +118,7 @@ def recall

# allow involved rules to be evaluated, but only once
# during a seed-growing iteration
if self.head.evaluated?(self.rule)
if self.head.eval?(self.rule)
self.head.eval_rules.delete(self.rule)
self.eval_rule_body_with_lr_support
end
Expand Down

0 comments on commit a762306

Please sign in to comment.