1

implement double

This commit is contained in:
Christoph
2021-08-14 17:54:14 +02:00
parent 080d932d56
commit ca80f7df2e
10 changed files with 210 additions and 14 deletions

View File

@ -1,8 +1,26 @@
from rply import Token
from simpleast import Program, ExprStatement, StringLiteral, ImplicitSelf, Assignment, DoubleLiteral
from simplelexer import lex
from simpleparser import parse
from objmodel import W_Integer
from objmodel import W_Integer, W_Double
from interpreter import Interpreter
def test_basic_double_lexing():
assert lex("0.1")[0] == Token("Double", "0.1")
assert lex(".1")[0] == Token("Double", ".1")
assert lex("1.")[0] == Token("Double", "1.")
assert lex("-5.5")[0] == Token("Double", "-5.5")
assert lex("-.5")[0] == Token("Double", "-.5")
assert lex("x = 0.0005")[:3] == [Token("Name", "x"), Token("Assign", "="), Token("Double", "0.0005")]
def test_basic_double_parsing():
assert parse("1.0") == Program([ExprStatement(DoubleLiteral("1.0"))])
assert parse("x = -.1") == Program([Assignment(ImplicitSelf(), "x", DoubleLiteral("-0.1"))])
def test_double_assignment():
ast = parse("""
x = 1.5
@ -15,7 +33,25 @@ x = 1.5
assert w_model.getvalue("x").value == 1.5
def test_double_operations():
def test_double_addition_subtraction():
ast = parse("""
x = 2.5 sub(2.4)
y = 2.5 add(2.4)
z = 3 sub(2.5)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Double)
assert w_model.getvalue("x").value == (2.5 - 2.4)
assert isinstance(w_model.getvalue("y"), W_Double)
assert w_model.getvalue("y").value == (2.5 + 2.4)
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 0
def test_double_division():
ast = parse("""
x = 3 div(2)
y = 3 div(2.0)
@ -33,6 +69,24 @@ z = 3.0 div(2.0)
assert w_model.getvalue("z").value == 1.5
def test_double_multiplication():
ast = parse("""
x = 3.3 mul(3.0)
y = 3.3 mul(3)
z = 3 mul(3.3)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
assert isinstance(w_model.getvalue("x"), W_Double)
assert w_model.getvalue("x").value == (3.3 * 3.0)
assert isinstance(w_model.getvalue("y"), W_Double)
assert w_model.getvalue("y").value == (3.3 * 3)
assert isinstance(w_model.getvalue("z"), W_Integer)
assert w_model.getvalue("z").value == 9
def test_double_conversion():
ast = parse("""
x = 1.5 toint