예제 #1
0
def entry_point(argv):
    path = argv[0] if len(argv) == 1 else argv[-1]
    try:
        f = open_file_as_stream(path, buffering=0)
    except OSError as exc:
        os.write(2, "%s -- %s (LoadError)\n" % (os.strerror(exc.errno), path))
        return 1

    try:
        code = f.readall()
    finally:
        f.close()

    try:
        t = parse(code)
    except BacktrackException as exc:
        (line, col) = exc.error.get_line_column(code)
        # expected = ' '.join(exc.error.expected)
        os.write(2, "parse error in line %d, column %d" % (line, col))
        return 1

    ctx = ExecutionContext()
    try:
        for sexpr in t:
            try:
                print(sexpr.eval(ctx).to_string())
            except ContinuationReturn as exc:
                print(exc.result.to_string())
    except SchemeQuit:
        return 0
    else:
        return 0
예제 #2
0
def main():
    print "PyPy Scheme interpreter"
    ctx = ExecutionContext()
    to_exec = ""
    cont = False
    while True:
        if cont:
            ps = ".. "
        else:
            ps = "-> "
        sys.stdout.write(ps)

        to_exec += sys.stdin.readline()
        if to_exec == "\n":
            to_exec = ""
        elif _check_parens(to_exec):
            try:
                if to_exec == "":
                    print ("")
                    raise SchemeQuit
                print (parse(to_exec)[0].eval(ctx).to_repr())
            except SchemeQuit:
                break
            except ContinuationReturn as exc:
                print (exc.result.to_string())
            except SchemeException as exc:
                print ("error: %s" % exc)
            except BacktrackException as exc:
                (line, col) = exc.error.get_line_column(to_exec)
                expected = " ".join(exc.error.expected)
                print ("parse error: in line %s, column %s expected: %s" % (line, col, expected))
            to_exec = ""
            cont = False
        else:
            cont = True