-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
244 lines (208 loc) · 9.92 KB
/
main.py
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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
import window
var_name_list = [" "]
var_value_list = [" "]
#Parse code
#解析はじめ
def lexer(code):
read_now = "" #今読んでいる文字変数
code_read = "" #今読んでいる途中の文字
code_read_mode = 1 #コードを読むか読まないか1読む0読まない
read_list = []
read_stop = [";","=",">",",","{","}"] #この記号があったらリストを区切る
command_fin = 0 #コマンドの終わり1おわりじゃない0
for n in range(len(code)):
read_now = code[n]
for i in range(len(read_stop)):
if read_now == read_stop[i]: #いま読んでいる文字がリストを区切る記号だったら
command_fin = 1 #コマンド終わり
if command_fin == 1:#プログラム終わりまたは記号なら
if code_read != "": #読んでいるcommandが空白でなければ
#記号をstr型としてよみこめるようにする
if code_read.count('"') == 0 and code_read.count("'") == 0: #クオーテーションがないなら
read_list.append(code_read) #リストに追加
read_list.append(read_now)
code_read = "" #初期化
elif code_read.count('"') >= 2 or code_read.count("'") >= 2: #クオーテーションが2つ(strの終わり)なら
read_list.append(code_read) #リストに追加
read_list.append(read_now)
code_read = "" #初期化
print("ok!")
elif code_read.count('"') == 1 or code_read.count("'") == 1: #クオーテーションが1つ(strの読み込み途中)なら
code_read = code_read + read_now
else: #空白だったら除外
read_list.append(read_now)
command_fin = 0
else: #改行などを削除
if read_now != "\n" and read_now != "\r" and read_now != " " and read_now != " ":
code_read = code_read + read_now
return read_list
#解析終了
#Run code
def code(code):
global var_name_list
global var_value_list
if_fin_pos = 0
loop_start_pos = 0
loop_start = 0
loop_read = ""
code_jmp = 0 #コードを読み飛ばす
if_mode = 0 #if文の処理を実行1 if文ではない0 条件式2
for n in range(len(code)): #関数の引数を取得
if code_jmp == 0:
if code[n] == ";": #commandの終わりなら初期化
var = 0
elif code[n] == "=": #変数宣言またはif文の条件式(==)
if if_mode == 2:
if var_list(code[n-1]) == var_list(code[n+1]):
if_mode = 1
else:
if_mode = 0
else:
var_dec_return = var_dec(code[n-1],var_list(code[n+1]))
print(var_dec_return[0])
print(var_dec_return[1])
elif code[n] == "<" and if_mode == 2: #if文条件式(<)
if var_list(code[n-1]) < var_list(code[n+1]):
if_mode = 1
else:
if_mode = 0
elif code[n] == ">" and if_mode == 2: #if文条件式(>)
if var_list(code[n-1]) > var_list(code[n+1]):
if_mode = 1
else:
if_mode = 0
elif code[n] == "if":
if_mode = 2
elif code[n] == "{":
if if_mode == 1:
pass
elif loop_start == 1:
loop_start_pos = n+1
code_jmp = 1
else:
code_jmp = 1
elif code[n] == "loop":
loop_start = 1
elif code[n] == "print":
window.write(var_list(code[n+2]))
elif code[n] == "text_color":
window.text_color_c(var_list(code[n+2]))
elif code[n] == "background":
window.background(var_list(code[n+2]))
elif code[n] == "}":
if_fin_pos = n
code_jmp = 0
if_mode = 0
if loop_start == 1:
if if_mode == 0:
loop(code[loop_start_pos:if_fin_pos],int(var_list(code[loop_start_pos-2])))
#Make a list of values and perform calculations, etc.
#値をリストにして計算などをする
def var_list(var_value):
global var_name_list
global var_value_list
value_list = []
read = ""
for n in range(len(var_value)): #記号で区切ってリストに収納
if var_value[n] == '"' or var_value[n] == "'" or var_value[n] == "+" or var_value[n] == "-" or var_value[n] == "*" or var_value[n] == "+" or var_value[n] == "/":
if read != "":
value_list.append(read)
value_list.append(var_value[n])
read = ""
else:
value_list.append(var_value[n])
else:
read = read + var_value[n]
if n == len(var_value)-1:
value_list.append(read)
if value_list.count("'") == 0 and value_list.count('"') == 0: #これが文字列ではないなら
var_value = calc(var2value(value_list))
else: #strなら
var_value = var_str(var2value(value_list))
print(value_list)
return var_value
#Variable declaration
#変数宣言
def var_dec(var_name,var_value):
global var_name_list
global var_value_list
if var_name_list.count(var_name) == 0: #この変数を読み込んだことがないなら
var_name_list.append(var_name) #変数名を追加
var_value_list.append(var_value) #値を追加
else: #読み込んだことがあるなら
var_pos = var_name_list.index(var_name) #(リストの中で)変数の位置を取得
var_value_list[var_pos] = var_value #値を追加
return var_name_list,var_value_list
#calc
#四則演算
def calc(calc):
var = int(calc[0]) #変数を一時的に保存する変数
for n in range(len(calc)):
if calc[n] == "+":
var = var + int(calc[n+1])
elif calc[n] == "-":
var = var - int(calc[n+1])
elif calc[n] == "*":
var = var * int(calc[n+1])
elif calc[n] == "/":
var = var / int(calc[n+1])
return str(var)
#variable declaration of str type
#str型の変数宣言
def var_str(i_value):
s_loop = 0 #クオーテーション検索時のループ回数
q = ""
o_value = ""
temp = ""
start_pos = 0
if i_value.count("'") == 0: #'が含まれてないなら
q = '"' #クオーテーション
s_loop = int(i_value.count('"')/2) #クオーテーションの数/2
elif i_value.count('"') == 0: #"が含まれていないなら
q = "'" #クオーテーション
s_loop = int(i_value.count("'")/2)
for n in range(s_loop):
start_pos = i_value.index(q)
temp = i_value[start_pos+1]
i_value = i_value[start_pos+3:]
o_value = o_value + temp
return o_value
#Make the value a variable
#配列ををまとめて変数にする
def var2value(value_list):
global var_name_list
global var_value_list
print(value_list)
for n in range(len(value_list)):
for i in range(len(var_name_list)):
if value_list[n] == var_name_list[i]: #変数が存在したなら
var_pos = var_name_list.index(value_list[n])
if value_list.count('"') != 0 or value_list.count("'") != 0: #str型なら
if len(value_list[n:]) == 1: #これでおしまいなら
if value_list.count('"') != 0: #区切りがダブルクォーテーションなら
value_list[n] = var_value_list[var_pos] #この場所を読み込んだ変数の値にする
value_list.insert(n,'"') #この場所の前にクォーテーションを追加
value_list.insert(n+2,'"') #この場所の後ろにクォーテーションを追加
else: #区切りがクォーテーションなら
value_list[n] = var_value_list[var_pos] #この場所を読み込んだ変数の値にする
value_list.insert(n,"'") #この場所の前にクォーテーションを追加
value_list.insert(n+2,"'") #この場所の後ろにクォーテーションを追加
pass
else:
if value_list[n+1] != '"' and value_list[n+1] != "'": #クオーテーションに囲まれていないなら
value_list[n] = var_value_list[var_pos] #この場所を読み込んだ変数の値にする
else: #strではないなら
value_list[n] = var_value_list[var_pos] #この場所を読み込んだ変数の値にする
return value_list
def loop(source,loop_num): #loop文
for n in range(loop_num):
code(source)
##############run
print(lexer("""
background>"#ff0000";
print>"hello,world!";"""))
##プログラム
code(lexer("""
print>"hello,world!";
""")) #ここにコードを書く yor code write here
window.root.mainloop()