1
This commit is contained in:
Christoph
2021-09-01 22:48:29 +02:00
parent 125e6dd260
commit 6d9a2d1ff6
7 changed files with 112 additions and 59 deletions

View File

@ -3,7 +3,7 @@ from rply import Token
from simpleast import Program, ExprStatement, BooleanLiteral, Assignment, ImplicitSelf
from simplelexer import lex
from simpleparser import parse
from objmodel import W_NormalObject, W_Integer, W_Boolean
from objmodel import W_Integer, W_Boolean
from interpreter import Interpreter

View File

@ -1,22 +0,0 @@
from bytecodeinterpreter import Interpreter
from simpleparser import parse
def builtin_test_helper(expr):
ast = parse("x = " + expr)
interpreter = Interpreter()
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
return w_module.getvalue("x").value
def test_sugar_builtins():
assert builtin_test_helper("2 add(5)") == 7
assert builtin_test_helper("2 mul(5)") == 10
assert builtin_test_helper("2 div(5)") == 0
assert builtin_test_helper("10 div(5)") == 2
assert builtin_test_helper("10 div(3)") == 3
assert builtin_test_helper("5 mod(3)") == 2
assert builtin_test_helper("4 mod(2)") == 0
assert builtin_test_helper("2 inc") == 3

View File

@ -1,6 +1,6 @@
from rply import Token
from simpleast import Program, ExprStatement, StringLiteral, ImplicitSelf, Assignment, DoubleLiteral
from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, DoubleLiteral
from simplelexer import lex
from simpleparser import parse
from objmodel import W_Integer, W_Double

View File

@ -1,10 +1,10 @@
from rply import Token
from simpleast import Program, ExprStatement, BooleanLiteral, ImplicitSelf, Assignment, StringLiteral
from interpreter import Interpreter
from objmodel import W_Integer, W_String, W_Boolean
from simpleast import Program, ExprStatement, ImplicitSelf, Assignment, StringLiteral
from simplelexer import lex
from simpleparser import parse
from objmodel import W_NormalObject, W_Integer, W_String, W_Boolean
from interpreter import Interpreter
def test_basic_string_lexing():

View File

@ -1,8 +1,8 @@
import py
from rply import Token
from simpleparser import parse
from objmodel import W_NormalObject
from interpreter import Interpreter
from simplelexer import lex
from simpleparser import parse
def sugar_test_helper(expr):
@ -14,6 +14,41 @@ def sugar_test_helper(expr):
return w_module.getvalue("x").value
def test_lexing():
token = lex("+ - * / ++ %")
assert Token("Plus", "+") == token[0]
assert Token("Minus", "-") == token[1]
assert Token("Multiply", "*") == token[2]
assert Token("Divide", "/") == token[3]
assert Token("Increment", "++") == token[4]
assert Token("Modulo", "%") == token[5]
def test_parsing():
assert parse("1 + 2") == parse("1 add(2)")
assert parse("1 + 2 + 3") == parse("1 add(2) add(3)")
assert parse("1 + 2 * 3") == parse("1 add(2 mul(3))")
assert parse("1 - 2 - 3") == parse("1 sub(2) sub(3)")
assert parse("1 + 2 % 3 / 4 - 5 * 6 + 7++") == parse("1 add(2 mod(3) div(4)) sub(5 mul(6)) add(7 inc)")
def test_parsing_parenthesis():
assert parse("(1 + 2)") == parse("1 add(2)")
assert parse("1 * (2 + 3)") == parse("1 mul(2 add(3))")
def test_sugar_builtins():
assert sugar_test_helper("2 add(5)") == 7
assert sugar_test_helper("2 mul(5)") == 10
assert sugar_test_helper("2 div(5)") == 0
assert sugar_test_helper("10 div(5)") == 2
assert sugar_test_helper("10 div(3)") == 3
assert sugar_test_helper("5 mod(3)") == 2
assert sugar_test_helper("4 mod(2)") == 0
assert sugar_test_helper("2 inc") == 3
def test_plus():
assert sugar_test_helper("1 + 1 + 1") == 3
assert sugar_test_helper("1 + 1") == 2
@ -40,9 +75,77 @@ def test_mod():
def test_inc():
assert sugar_test_helper("1 ++") == 2
assert sugar_test_helper("1 ++ + 1") == 3 # Is this allowed?
assert sugar_test_helper("1 ++ + 1") == 3
assert sugar_test_helper("2 * 2 ++") == 6
ast = parse("""
i = 1
i++
x = i
""")
interpreter = Interpreter()
w_module = interpreter.make_module()
interpreter.eval(ast, w_module)
assert w_module.getvalue("x").value == 2
def test_inplace_arithmetic():
ast = parse("""
w = 5
x = 5
y = 5
z = 5
w += 1
x -= 2
y *= 5
z /= 2
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert w_model.getvalue("w").value == 6
assert w_model.getvalue("x").value == 3
assert w_model.getvalue("y").value == 25
assert w_model.getvalue("z").value == 2
def test_comparisons():
ast = parse("""
u = 5 < 3
v = 5 <= 5
w = 5 > 3
x = 5 >= 3
y = 5 == 6
z = 5 != 6
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert w_model.getvalue("u").istrue() is False
assert w_model.getvalue("v").istrue() is True
assert w_model.getvalue("w").istrue() is True
assert w_model.getvalue("x").istrue() is True
assert w_model.getvalue("y").istrue() is False
assert w_model.getvalue("z").istrue() is True
def test_logical():
ast = parse("""
x = true && false
y = true || false
z = !true
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert w_model.getvalue("x").istrue() is False
assert w_model.getvalue("y").istrue() is True
assert w_model.getvalue("z").istrue() is False
def test_mixed_precedence():
assert sugar_test_helper("2 * 3 / 2") == 3

View File

@ -1,13 +0,0 @@
from rply import Token
from simplelexer import lex
def test_lexing():
token = lex("+ - * / ++ %")
assert Token("Plus", "+") == token[0]
assert Token("Minus", "-") == token[1]
assert Token("Multiply", "*") == token[2]
assert Token("Divide", "/") == token[3]
assert Token("Increment", "++") == token[4]
assert Token("Modulo", "%") == token[5]

View File

@ -1,15 +0,0 @@
from simpleparser import parse
def test_parsing():
assert parse("1 + 2") == parse("1 $int_add(2)")
assert parse("1 + 2 + 3") == parse("1 $int_add(2) $int_add(3)")
assert parse("1 + 2 * 3") == parse("1 $int_add(2 $int_mul(3))")
assert parse("1 - 2 - 3") == parse("1 $int_sub(2) $int_sub(3)")
assert parse("1 + 2 % 3 / 4 - 5 * 6 + 7++") \
== parse("1 $int_add(2 $int_mod(3) $int_div(4)) $int_sub(5 $int_mul(6)) $int_add(7 $int_inc)")
def test_parsing_parenthesis():
assert parse("(1 + 2)") == parse("1 $int_add(2)")
assert parse("1 * (2 + 3)") == parse("1 $int_mul(2 $int_add(3))")