-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathrun.py
More file actions
124 lines (119 loc) · 4.32 KB
/
run.py
File metadata and controls
124 lines (119 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
from utils import *
import platform
import datetime
import json
from lexer import lexer
from parse import parser
import sys
sys.path.append('./lib')
with open("config.json","r") as f:
data = json.load(f)[0]
name = data["name"]
version = data["version"]
madeby = data["madeby"]
pyversion = platform.python_version()
print(f"{name} {version} 2023 {madeby} Default({datetime.datetime.now()})")
print(f"[Python {pyversion}] on linux")
print()
Reserved_word = {"p":print,"input":input}
def evaluate(tree, genv, lenv):
if tree == None:
return
elif type(tree) != list:
if tree in lenv:
return lenv[tree]
elif type(tree) == str:
return tree[1:-1]
elif type(tree) == int:
return tree
else:
if len(tree) == 1:
pass
elif tree[1] == "+":
return evaluate(tree[0],genv,lenv)+evaluate(tree[2],genv,lenv)
elif tree[1] == "-":
return evaluate(tree[0],genv,lenv)-evaluate(tree[2],genv,lenv)
elif tree[1] == "*":
return evaluate(tree[0],genv,lenv)*evaluate(tree[2],genv,lenv)
elif tree[1] == "/":
left = evaluate(tree[0],genv,lenv)
right = evaluate(tree[2],genv,lenv)
if right == 0:
ZeroDivision(f"{left} / {right} ゼロで割ってはいけません")
return left / right
elif tree[1] == "++":
left = evaluate(tree[0],genv,lenv)
lenv[tree[0]] = left + 1
elif tree[1] == "**":
return evaluate(tree[0],genv,lenv)**evaluate(tree[2],genv,lenv)
elif tree[1] == "%":
left = evaluate(tree[0],genv,lenv)
right = evaluate(tree[2],genv,lenv)
if right == 0:
ZeroDivision("division by Zero")
return left % right
elif tree[1] == "<":
return evaluate(tree[0],genv,lenv)<evaluate(tree[2],genv,lenv)
elif tree[1] == ">":
return evaluate(tree[0],genv,lenv)>evaluate(tree[2],genv,lenv)
elif tree[1] == "==":
return evaluate(tree[0],genv,lenv) == evaluate(tree[2],genv,lenv)
elif tree[1] == "=":
lenv[tree[0]] = evaluate(tree[2],genv,lenv)
elif tree[1] == ";":
evaluate(tree[0],genv,lenv)
evaluate(tree[2],genv,lenv)
elif tree[1] == ",":
args = [evaluate(tree[0],genv,lenv),evaluate(tree[2],genv,lenv)]
return flat(args)
elif tree[0][0] == "if":
if evaluate(tree[0][1],genv,lenv):
evaluate(tree[0][2],genv,lenv)
else:
evaluate(tree[0][3],genv,lenv)
evaluate(tree[1],genv,lenv)
elif tree[0][0] == "while":
while evaluate(tree[0][1],genv,lenv):
evaluate(tree[0][2],genv,lenv)
evaluate(tree[1],genv,lenv)
elif tree[0][0] == "func":
args = flat(tree[0][2])
while "," in args:
args.remove(",")
genv[tree[0][1]] = [args, tree[0][3]]
evaluate(tree[1],genv,lenv)
elif tree[0][0] == "import":
with open(f"{tree[0][1]}.ppp", "r") as f:
prg = f.read()
evaluate(parser(lexer(prg)),genv,lenv)
evaluate(tree[1],genv,lenv)
elif tree[0][0] == "using":
with open(f"./lib/{tree[0][1]}.pyp","r") as f:
prg = json.load(f)[0]
for i in prg:
if i == "import":
continue
else:
Reserved_word[i] = using_module(prg["import"],prg[i])
evaluate(tree[1],genv,lenv)
elif tree[0] in genv:
new_env = {}
num = 1
tree = flat(tree)
while "," in tree:
tree.remove(",")
for i in genv[tree[0]][0]:
new_env[i] = evaluate(tree[num],genv,lenv)
num += 1
evaluate(genv[tree[0]][1],genv,new_env)
elif tree[0] in Reserved_word:
args = evaluate(tree[1],genv,lenv)
if type(args) == list:
args = tuple(args)
else:
args = tuple([args])
return execute(Reserved_word[tree[0]], args)
elif type(tree[0]) == list:
evaluate(tree[0])
else:
NotFindFunc(tree[0])