Skip to content

Commit 8f6c950

Browse files
committed
reconstruct the function class and add new classes for built-in function
1 parent 25b73c9 commit 8f6c950

File tree

2 files changed

+59
-25
lines changed

2 files changed

+59
-25
lines changed

__pycache__/basic.cpython-312.pyc

1.8 KB
Binary file not shown.

basic.py

Lines changed: 59 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from jinja2.runtime import new_context
2+
from numba.typed.listobject import new_list
3+
14
TT_FLOAT = 'FLOAT'
25
TT_IDENTIFIER = 'IDENTIFIER'
36
TT_KEYWORD = 'KEYWORD'
@@ -1177,7 +1180,7 @@ def dived_by(self, other):
11771180
if isinstance(other, Number):
11781181
new_list = self.copy()
11791182
try:
1180-
return self.elements[other.value],None
1183+
return self.elements[other.value], None
11811184
except:
11821185
return None, RTError(
11831186
other.pos_start, other.pos_end,
@@ -1361,6 +1364,11 @@ def __repr__(self):
13611364
return str(self.value)
13621365

13631366

1367+
Number.null = Number(0)
1368+
Number.false = Number(0)
1369+
Number.true = Number(1)
1370+
1371+
13641372
class Context:
13651373
def __init__(self, display_name, parent=None, parent_entry_pos=None):
13661374
self.display_name = display_name
@@ -1369,42 +1377,64 @@ def __init__(self, display_name, parent=None, parent_entry_pos=None):
13691377
self.symbol_table = None
13701378

13711379

1372-
class Function(Value):
1373-
def __init__(self, name, body_node, arg_names):
1380+
class BaseFunction(Value):
1381+
def __init__(self, name):
13741382
super().__init__()
13751383
self.name = name or "<anonymous>"
1376-
self.body_node = body_node
1377-
self.arg_names = arg_names
13781384

1379-
def execute(self, args):
1380-
res = RTResult()
1381-
interpreter = Interpreter()
1385+
def generate_new_context(self):
13821386
new_context = Context(self.name, self.context, self.pos_start)
13831387
new_context.symbol_table = SymbolTable(new_context.parent.symbol_table)
1388+
return new_context
13841389

1385-
if len(args) > len(self.arg_names):
1390+
def check_args(self, arg_names, args):
1391+
res=RTResult()
1392+
if len(args) > len(arg_names):
13861393
return res.failure(RTError(
13871394
self.pos_start, self.pos_end,
1388-
f"{len(args) - len(self.arg_names)} too many args passed into {self.name}",
1395+
f"{len(args) - len(arg_names)} too many args passed into {self.name}",
13891396
self.context
13901397

13911398
)
13921399
)
1393-
elif len(args) < len(self.arg_names):
1400+
elif len(args) < len(arg_names):
13941401
return res.failure(RTError(
13951402
self.pos_start, self.pos_end,
1396-
f"{len(self.arg_names) - len(args)} need more args passed into {self.name}",
1403+
f"{len(arg_names) - len(args)} need more args passed into {self.name}",
13971404
self.context
13981405

13991406
)
14001407
)
1408+
return res.success(None)
14011409

1410+
def populate_args(self,arg_names,args,exec_ctx):
14021411
for i in range(len(args)):
1403-
arg_name = self.arg_names[i]
1412+
arg_name = arg_names[i]
14041413
arg_value = args[i]
1405-
arg_value.set_context(new_context)
1406-
new_context.symbol_table.set(arg_name, arg_value)
1407-
value = res.register(interpreter.visit(self.body_node, new_context))
1414+
#maybe newcontext?
1415+
arg_value.set_context(exec_ctx)
1416+
exec_ctx.symbol_table.set(arg_name, arg_value)
1417+
def check_and_populate_args(self,arg_names,args,exec_ctx):
1418+
res=RTResult()
1419+
res.register(self.check_args(arg_names,args))
1420+
if res.error: return res
1421+
self.populate_args(arg_names,args,exec_ctx)
1422+
return res.success((None))
1423+
1424+
1425+
1426+
class Function(BaseFunction):
1427+
def __init__(self, name, body_node, arg_names):
1428+
super().__init__(name)
1429+
self.body_node = body_node
1430+
self.arg_names = arg_names
1431+
1432+
def execute(self, args):
1433+
res = RTResult()
1434+
interpreter = Interpreter()
1435+
exec_ctx = self.generate_new_context()
1436+
res.register(self.check_and_populate_args(self.arg_names,args,exec_ctx=exec_ctx))
1437+
value = res.register(interpreter.visit(self.body_node, exec_ctx))
14081438
if res.error: return res
14091439
return res.success(value)
14101440

@@ -1418,6 +1448,12 @@ def __repr__(self):
14181448
return f"<function {self.name}>"
14191449

14201450

1451+
class BuiltInFunction(BaseFunction):
1452+
pass
1453+
1454+
1455+
1456+
14211457
class SymbolTable:
14221458
def __init__(self, parent=None):
14231459
self.symbols = {}
@@ -1458,7 +1494,7 @@ def visit_ListNode(self, node, context):
14581494

14591495
def visit_ForNode(self, node, context):
14601496
res = RTResult()
1461-
elements=[]
1497+
elements = []
14621498

14631499
start_value = res.register(self.visit(node.start_value_node, context))
14641500
if res.error: return res
@@ -1486,23 +1522,21 @@ def visit_ForNode(self, node, context):
14861522
elements.append(res.register(self.visit(node.body_node, context)))
14871523
if res.error: return res
14881524

1489-
return res.success(List(elements).set_context(context).set_pos(node.pos_start,node.pos_end))
1525+
return res.success(List(elements).set_context(context).set_pos(node.pos_start, node.pos_end))
14901526

14911527
def visit_WhileNode(self, node, context):
14921528
res = RTResult()
1493-
elements=[]
1529+
elements = []
14941530
while True:
14951531
condition = res.register(self.visit(node.condition_node, context))
14961532
if res.error: return res
14971533

14981534
if not condition.is_true(): break
14991535

1500-
1501-
15021536
elements.append(res.register(self.visit(node.body_node, context)))
15031537
if res.error: return res
15041538

1505-
return res.success(List(elements).set_context(context).set_pos(node.pos_start,node.pos_end))
1539+
return res.success(List(elements).set_context(context).set_pos(node.pos_start, node.pos_end))
15061540

15071541
def visit_NumberNode(self, node, context):
15081542
return RTResult().success(
@@ -1646,9 +1680,9 @@ def visit_CallNode(self, node, context):
16461680

16471681

16481682
global_symbol_table = SymbolTable()
1649-
global_symbol_table.set("NULL", Number(0))
1650-
global_symbol_table.set("False", Number(0))
1651-
global_symbol_table.set("True", Number(1))
1683+
global_symbol_table.set("NULL", Number.null)
1684+
global_symbol_table.set("False", Number.false)
1685+
global_symbol_table.set("True", Number.true)
16521686

16531687

16541688
def run(fn, text):

0 commit comments

Comments
 (0)