def generate_ensure(me, pattern, result, previous_result, stream, failure): my_result = newResult() data = """ %s = Result.new(%s.getPosition()) %s """ % (my_result, result, pattern.next.generate_v1(me, my_result, result, stream, failure).strip()) return data
def generate_or(me, pattern, peg, result, stream, failure, tail, peg_args): data = "" success = gensym("success") for pattern in pattern.patterns: # TODO: lazily create this out = gensym("or") my_result = newResult() fail = lambda : "goto %s;" % out if pattern == pattern.patterns[-1]: fail = failure data += """ { Result %(new-result)s(%(result)s.getPosition()); %(code)s %(result)s = %(new-result)s; } goto %(success)s; %(out)s: """ % {'new-result': my_result, 'result': result, 'code': pattern.generate_cpp(peg, my_result, stream, fail, tail, peg_args).strip(), 'success': success, 'out': out} data += "%s:\n" % success return data
def generate_ensure(me, pattern, peg, result, stream, failure, tail, peg_args): my_result = newResult() data = """ Result %(new-result)s(%(result)s.getPosition()); %(code)s """ % {'new-result': my_result, 'result': result, 'code': pattern.next.generate_cpp(peg, my_result, stream, failure, None, peg_args).strip()} return data
def generate_ensure(me, pattern, peg, result, stream, failure, tail, peg_args): my_result = newResult() data = """ Result %s(%s.getPosition()); %s """ % (my_result, result, pattern.next.generate_cpp(peg, my_result, stream, failure, None, peg_args).strip()) return data
def generate_sequence(me, pattern, result, previous_result, stream, failure): data = "" for apattern in pattern.patterns: my_result = newResult() data += """ %s = Result.new(%s.getPosition()) %s %s.addResult(%s) """ % (my_result, result, apattern.generate_v1(me, my_result, result, stream, failure), result, my_result) return data + """ %s.setValue(%s.getLastValue()) """ % (result, result)
def generate_not(me, pattern, result, previous_result, stream, failure): my_result = newResult() my_fail = lambda : "raise NotError" data = """ %s = Result(%s.getPosition()); try: %s %s except NotError: %s.setValue(None) """ % (my_result, result, indent(pattern.next.generate_python(my_result, result, stream, my_fail).strip()), failure(), result) return data
def generate_repeat_once(me, pattern, result, previous_result, stream, failure): my_fail = lambda: "raise PegError" my_result = newResult() my_result2 = newResult() data = """ try: while True: %s = Result(%s.getPosition()); %s %s.addResult(%s); except PegError: if %s.matches() == 0: %s """ % (my_result, result, indent( indent( pattern.next.generate_python(my_result, result, stream, my_fail).strip())), result, my_result, result, failure()) return data
def generate_not(me, pattern, result, previous_result, stream, failure): my_result = newResult() my_fail = lambda : "raise NotError" data = """ %s = Result.new(%s.getPosition()) begin %s %s rescue NotError %s.setValue(nil) end """ % (my_result, result, indent(pattern.next.generate_v1(my_result, result, stream, my_fail).strip()), failure(), result) return data
def generate_repeat_many(me, pattern, result, previous_result, stream, failure): my_fail = lambda : "raise PegError" my_result = newResult() data = """ try: while True: %s = Result(%s.getPosition()); %s %s.addResult(%s); except PegError: pass """ % (my_result, result, indent(indent(pattern.next.generate_python(my_result, result, stream, my_fail).strip())), result, my_result) return data
def generate_sequence(me, pattern, peg, result, stream, failure, tail, peg_args): if len(pattern.patterns) == 1: return pattern.patterns[0].generate_cpp(peg, result, stream, failure, tail, peg_args) else: # for each pattern, save the result in a temporary variable. only create # temporaries if the result is used. looking up a variable through the # 'args' accessor tells the code generator to generate the variable data = [] def invalid(d): raise Exception("Invalid result %s" % d) args = invalid use_args = [] arg_num = 0 fail = False for apattern in pattern.patterns: use_args.append("") do_tail = None if apattern == pattern.patterns[-1]: do_tail = tail else: # lexical scope is broken so we need another function here def make(n, old_arg, my_result): def get(d): # print "Looking for %s arg_num is %d result is %s. previous is %s" % (d, n, my_result, old_arg) if d == n: use_args[n - 1] = "Result %s = %s;" % (my_result, result) return my_result return old_arg(d) return get arg_num += 1 args = make(arg_num, args, newResult()) data.append(""" %s """ % (indent( apattern.generate_cpp(peg, result, stream, failure, do_tail, args).strip()))) return "{\n%s\n}" % indent('\n'.join( ["%s\n%s" % (x[0], x[1]) for x in zip(data, use_args)]))
def generate_repeat_many(me, pattern, result, previous_result, stream, failure): my_fail = lambda : "raise PegError" my_result = newResult() data = """ begin while true %s = Result.new(%s.getPosition()) %s %s.addResult(%s) end rescue PegError end """ % (my_result, result, indent(indent(pattern.next.generate_v1(me, my_result, result, stream, my_fail).strip())), result, my_result) return data
def generate_ensure(me, pattern, peg, result, stream, failure, tail, peg_args): my_result = newResult() data = """ Result %(new-result)s(%(result)s.getPosition()); %(code)s """ % { 'new-result': my_result, 'result': result, 'code': pattern.next.generate_cpp(peg, my_result, stream, failure, None, peg_args).strip() } return data
def generate_sequence(me, pattern, result, previous_result, stream, failure): data = "" for apattern in pattern.patterns: my_result = newResult() data += """ %s = Result(%s.getPosition()) %s %s.addResult(%s); """ % (my_result, result, apattern.generate_python(my_result, result, stream, failure), result, my_result) return data + """ %s.setValue(%s.getLastValue()) """ % (result, result)
def generate_not(me, pattern, result, previous_result, stream, failure): my_result = newResult() my_fail = lambda: "raise NotError" data = """ %s = Result(%s.getPosition()); try: %s %s except NotError: %s.setValue(None) """ % (my_result, result, indent( pattern.next.generate_python( my_result, result, stream, my_fail).strip()), failure(), result) return data
def generate_or(me, pattern, result, previous_result, stream, failure): data = "" fail = failure save = gensym("save") for next_pattern in pattern.patterns[::-1]: my_result = newResult() data = """ %s = Result(%s) %s """ % (result, save, next_pattern.generate_python(result, previous_result, stream, fail).strip()) fail = lambda: data return """ %s = %s.getPosition() %s """ % (save, result, data)
def generate_not(me, pattern, peg, result, stream, failure, tail, peg_args): not_label = gensym("not") my_result = newResult() my_fail = lambda: "goto %s;" % not_label data = """ Result %s(%s); %s %s %s: %s.setValue(Value((void*)0)); """ % (my_result, result, pattern.next.generate_cpp( peg, my_result, stream, my_fail, None, peg_args).strip(), failure(), not_label, result) return data
def generate_repeat_many(me, pattern, peg, result, stream, failure, tail, peg_args): loop_done = gensym("loop") my_fail = lambda: "goto %s;" % loop_done my_result = newResult() data = """ %(result)s.reset(); do{ Result %(new-result)s(%(result)s.getPosition()); %(code)s %(result)s.addResult(%(new-result)s); } while (true); %(loop-done)s: ; """ % {'result': result, 'new-result': my_result, 'code': indent(pattern.next.generate_cpp(peg, my_result, stream, my_fail, tail, peg_args).strip()), 'loop-done': loop_done} return data
def generate_not(me, pattern, result, previous_result, stream, failure): my_result = newResult() my_fail = lambda: "raise NotError" data = """ %s = Result.new(%s.getPosition()) begin %s %s rescue NotError %s.setValue(nil) end """ % (my_result, result, indent( pattern.next.generate_v1( my_result, result, stream, my_fail).strip()), failure(), result) return data
def generate_not(me, pattern, peg, result, stream, failure, tail, peg_args): not_label = gensym("not") my_result = newResult() my_fail = lambda : "goto %s;" % not_label data = """ Result %(new-result)s(%(result)s); %(code)s %(fail)s %(not)s: %(result)s.setValue(Value((void*)0)); """ % {'new-result': my_result, 'result': result, 'code': pattern.next.generate_cpp(peg, my_result, stream, my_fail, None, peg_args).strip(), 'fail': failure(), 'not': not_label, 'result': result} return data
def newPattern(pattern, stream, result, success): my_result = newResult() previous_position = gensym('position') out = [False] def label(n): if n != False: return "%s:" % n return "" def fail(): if out[0] == False: out[0] = newOut() return "%s.setPosition(%s);\ngoto %s;" % ( result, previous_position, out[0]) pattern_result = pattern.generate_cpp(peg, my_result, stream, fail, tail, peg_args).strip() old_data = """ { Result %s(%s.getPosition()); %s %s = %s; } %s %s """ % (my_result, result, pattern_result, result, my_result, success, label(out[0])) data = """ { int %s = %s.getPosition(); %s } %s %s """ % (previous_position, result, indent(pattern.generate_cpp(peg, result, stream, fail, tail, peg_args)), success, label(out[0])) return data
def generate_repeat_many(me, pattern, peg, result, stream, failure, tail, peg_args): loop_done = gensym("loop") my_fail = lambda: "goto %s;" % loop_done my_result = newResult() data = """ %s.reset(); do{ Result %s(%s.getPosition()); %s %s.addResult(%s); } while (true); %s: ; """ % (result, my_result, result, indent( pattern.next.generate_cpp( peg, my_result, stream, my_fail, tail, peg_args).strip()), result, my_result, loop_done) return data
def generate_repeat_many(me, pattern, result, previous_result, stream, failure): my_fail = lambda: "raise PegError" my_result = newResult() data = """ begin while true %s = Result.new(%s.getPosition()) %s %s.addResult(%s) end rescue PegError end """ % (my_result, result, indent( indent( pattern.next.generate_v1( me, my_result, result, stream, my_fail).strip())), result, my_result) return data
def generate_sequence(me, pattern, peg, result, stream, failure, tail, peg_args): if len(pattern.patterns) == 1: return pattern.patterns[0].generate_cpp(peg, result, stream, failure, tail, peg_args) else: # for each pattern, save the result in a temporary variable. only create # temporaries if the result is used. looking up a variable through the # 'args' accessor tells the code generator to generate the variable data = [] def invalid(d): raise Exception("Invalid result %s" % d) args = invalid use_args = [] arg_num = 0 fail = False for apattern in pattern.patterns: use_args.append("") do_tail = None if apattern == pattern.patterns[-1]: do_tail = tail else: # lexical scope is broken so we need another function here def make(n, old_arg, my_result): def get(d): # print "Looking for %s arg_num is %d result is %s. previous is %s" % (d, n, my_result, old_arg) if d == n: use_args[n-1] = "Result %s = %s;" % (my_result, result) return my_result return old_arg(d) return get arg_num += 1 args = make(arg_num, args, newResult()) data.append(""" %s """ % (indent(apattern.generate_cpp(peg, result, stream, failure, do_tail, args).strip()))) return "{\n%s\n}" % indent('\n'.join(["%s\n%s" % (x[0], x[1]) for x in zip(data, use_args)]))
def generate_or(me, pattern, peg, result, stream, failure, tail, peg_args): data = "" success = gensym("success") for pattern in pattern.patterns: # TODO: lazily create this out = gensym("or") my_result = newResult() fail = lambda: "goto %s;" % out if pattern == pattern.patterns[-1]: fail = failure data += """ { Result %s(%s.getPosition()); %s %s = %s; } goto %s; %s: """ % (my_result, result, pattern.generate_cpp(peg, my_result, stream, fail, tail, peg_args).strip(), result, my_result, success, out) data += "%s:\n" % success return data