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
|
module Treetop
module Compiler
class Predicate < ParsingExpression
def compile(address, builder, parent_expression)
super
begin_comment(parent_expression)
use_vars :result, :start_index
obtain_new_subexpression_address
parent_expression.prefixed_expression.compile(subexpression_address, builder)
builder.if__(subexpression_success?) { when_success }
builder.else_ { when_failure }
end_comment(parent_expression)
end
def assign_failure
reset_index
super(start_index_var)
end
def assign_success
reset_index
assign_result epsilon_node
end
end
class AndPredicate < Predicate
def when_success
assign_success
end
def when_failure
assign_failure
end
end
class NotPredicate < Predicate
def when_success
assign_failure
if (e = parent.atomic.expected)
builder << "terminal_parse_failure(#{e}, true)"
end
end
def when_failure
if (e = parent.atomic.expected)
builder << "@terminal_failures.pop"
end
assign_success
end
end
end
end
|