Example #1
0
def demo():
    from parser import tokenize, parse_exp
    source = '(* 6 (+ 3 4))'
    tokens = tokenize(source)
    expr = parse_exp(tokens)
    result = evaluate(expr)
    print(result)
Example #2
0
def repl(input_fn=input):
    """Read-Eval-Print-Loop"""
    print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr)

    while True:
        # ___________________________________________ Read
        try:
            line = input_fn('> ')
        except EOFError:
            break
        if line == QUIT_COMMAND:
            break
        if not line:
            continue

        # ___________________________________________ Eval
        current_exp = parse_exp(tokenize(line))
        if isinstance(current_exp, list) and current_exp[0] == 'define':
            result = define_function(current_exp[1:])
        else:
            try:
                result = evaluate({}, current_exp)
            except (errors.UndefinedVariable, errors.UndefinedFunction) as exc:
                print('***', exc)
                continue

        # ___________________________________________ Print
        print(result)
Example #3
0
def repl(input_fn=input):
    """Read-Eval-Print-Loop"""
    print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr)

    while True:
        # ___________________________________________ Read
        try:
            line = input_fn('> ')
        except EOFError:
            break
        if line == QUIT_COMMAND:
            break
        if not line:
            continue

        # ___________________________________________ Eval
        current_exp = parse_exp(tokenize(line))
        try:
            value = evaluate(current_exp)
        except errors.UndefinedVariable as exc:
            print('***', exc)
            continue

        # ___________________________________________ Print
        print(value)
Example #4
0
def repl(input_fn=input):
    """Read-Eval-Print-Loop"""
    print(f'To exit, type {QUIT_COMMAND}', file=sys.stderr)

    while True:
        # ___________________________________________ Read
        try:
            source = multiline_input('> ',
                                     '... ',
                                     quit_cmd=QUIT_COMMAND,
                                     input_fn=input_fn)
        except (EOFError, QuitRequest):
            break
        except errors.UnexpectedCloseParen as exc:
            print('***', exc)
            continue
        if not source:
            continue

        # ___________________________________________ Eval
        current_exp = parse_exp(tokenize(source))
        if isinstance(current_exp, list) and current_exp[0] == 'define':
            result = define_function(current_exp[1:])
        else:
            try:
                result = evaluate({}, current_exp)
            except errors.EvaluatorException as exc:
                print('***', exc)
                continue

        # ___________________________________________ Print
        print(result)
Example #5
0
def run(source_file, env=None):
    """Read and execute opened source file"""
    source = source_file.read()
    if env is None:
        env = {}
    tokens = tokenize(source)

    while tokens:
        try:
            current_exp = parse_exp(tokens)
        except errors.UnexpectedCloseParen as exc:
            print('***', exc, file=sys.stderr)
            break

        if isinstance(current_exp, list) and current_exp[0] == 'define':
            define_function(current_exp[1:])
        else:
            try:
                evaluate(env, current_exp)
            except errors.EvaluatorException as exc:
                print('***', exc, file=sys.stderr)
                continue
Example #6
0
def test_parse_unexpected_end_of_source():
    tokens = tokenize('(')
    with raises(errors.UnexpectedEndOfSource) as excinfo:
        parse_exp(tokens)
    assert "Unexpected end of source code." == str(excinfo.value)
Example #7
0
def test_parse_unexpected_close_parenthesis():
    tokens = tokenize(')')
    with raises(errors.UnexpectedCloseParen) as excinfo:
        parse_exp(tokens)
    assert "Unexpected close parenthesis." == str(excinfo.value)
Example #8
0
def test_parse_exp_application(source, ast):
    got = parse_exp(tokenize(source))
    assert ast == got
Example #9
0
def test_parse_exp_atoms(source, ast):
    got = parse_exp(tokenize(source))
    assert ast == got