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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #7
0
    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
Example #10
0
    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
Example #12
0
    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
Example #13
0
    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)
Example #14
0
    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
Example #15
0
    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)
Example #16
0
    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
Example #17
0
    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
Example #18
0
    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
Example #19
0
    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
Example #20
0
            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
Example #21
0
    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
Example #22
0
    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
Example #23
0
    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)]))
Example #24
0
    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