Skip to content

Commit 73843f6

Browse files
committed
Add transpiler to language processing system
1 parent cfd57ef commit 73843f6

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

82 files changed

+1644
-44
lines changed

.DS_Store

0 Bytes
Binary file not shown.

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
packages=find_packages(),
77
entry_points={
88
'console_scripts': [
9-
'vython=src.run:main'
9+
'vython=src.main:main'
1010
]
1111
}
1212
)
File renamed without changes.

src/compatibilitychecker.py renamed to src/interpreter/compatibilitychecker.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.syntax.semantics import VersionTable
1+
from src.interpreter.syntax.semantics import VersionTable
22

33
# バージョンの整合性検査
44
# アルゴリズムと仕様もコメントで書くこと

src/compiler.py renamed to src/interpreter/compiler.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from src.parser import Parser
2-
from src.larkToIR import LarkToCustomAST
3-
from src.interpreter import Interpreter
4-
from src.syntax.semantics import resolve_heap_object
1+
from src.interpreter.parser import Parser
2+
from src.interpreter.larkToIR import LarkToCustomAST
3+
from src.interpreter.interpreter import Interpreter
4+
from src.interpreter.syntax.semantics import resolve_heap_object
55

66
class Compiler:
77
def __init__(self, code, debug_mode=False):

src/interpreter.py renamed to src/interpreter/interpreter.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
from src.syntax.semantics import *
2-
from src.syntax.language import *
3-
from src.compatibilitychecker import *
4-
from src.primitive_lib.Primitive_lib import *
1+
from src.interpreter.syntax.semantics import *
2+
from src.interpreter.syntax.language import *
3+
from src.interpreter.compatibilitychecker import *
4+
from src.interpreter.primitive_lib.Primitive_lib import *
55
import re
66
import copy
77

src/larkToIR.py renamed to src/interpreter/larkToIR.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from lark import Token, Transformer, Tree
2-
from src.syntax.language import *
2+
from src.interpreter.syntax.language import *
33

44

55
class LarkToCustomAST(Transformer):

src/parser.py renamed to src/interpreter/parser.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def __init__(self, debug_mode=False):
1717

1818
def parse(self, code):
1919
# 文法定義を読み込む
20-
with open("src/syntax/lark-vython.lark", "r") as file:
20+
with open("src/interpreter/syntax/lark-vython.lark", "r") as file:
2121
grammar = file.read()
2222

2323
parser = Lark(
File renamed without changes.

src/primitive_lib/Boolean_lib.py renamed to src/interpreter/primitive_lib/Boolean_lib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.syntax.semantics import *
1+
from src.interpreter.syntax.semantics import *
22

33
# 評価開始時にヒープに入る情報
44
vtb = VersionTable("bool", 0, False)

src/primitive_lib/Number_lib.py renamed to src/interpreter/primitive_lib/Number_lib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.syntax.semantics import *
1+
from src.interpreter.syntax.semantics import *
22

33
# 評価開始時にヒープに入る情報
44
vtn = VersionTable("number", 0, False)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from src.interpreter.primitive_lib.Number_lib import *
2+
from src.interpreter.primitive_lib.String_lib import *
3+
from src.interpreter.primitive_lib.Boolean_lib import *
4+
5+
primitive_classes = {"number", "string", "bool"}

src/primitive_lib/String_lib.py renamed to src/interpreter/primitive_lib/String_lib.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.syntax.semantics import *
1+
from src.interpreter.syntax.semantics import *
22

33
# 評価開始時にヒープに入る情報
44
vts = VersionTable("string", 0, False)
File renamed without changes.

src/run.py renamed to src/interpreter/run.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import sys
22
import time
3-
from src.compiler import Compiler
3+
from src.interpreter.compiler import Compiler
44

55
def execute_phase(message, function):
66
start_time = time.time()
@@ -9,12 +9,12 @@ def execute_phase(message, function):
99
print(message)
1010
print(f" --> Completed in {end_time - start_time:.2f} seconds")
1111

12-
def main():
12+
def run(args):
1313
debug_mode = False
1414
file_path = None
1515

1616
# コマンドライン引数の処理
17-
for arg in sys.argv[1:]:
17+
for arg in args:
1818
if arg in ["--debug", "-d"]:
1919
debug_mode = True
2020
else:
@@ -43,6 +43,3 @@ def main():
4343
execute_phase("[Phase 4] Interpretation", lambda: compiler.evaluate())
4444

4545
print(f"[Result]\n {compiler.get_result()}")
46-
47-
if __name__ == "__main__":
48-
main()
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/syntax/semantics.py renamed to src/interpreter/syntax/semantics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from src.syntax.language import Name, Version
1+
from src.interpreter.syntax.language import Name, Version
22

33
# 計算結果全体を示すクラス
44
class Result:

src/main.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import sys
2+
import src.interpreter.run as i
3+
import src.transpiler.run as t
4+
5+
class CommandError(Exception):
6+
pass
7+
8+
def main():
9+
execute_mode = sys.argv[1]
10+
# コマンドライン引数の処理
11+
try:
12+
if execute_mode == "-i":
13+
i.run(sys.argv[2:])
14+
elif execute_mode == "-t":
15+
t.run(sys.argv[2:])
16+
else:
17+
raise CommandError(f"Unknown command: {execute_mode}")
18+
except CommandError as e:
19+
print(f"Error: {e}")
20+
sys.exit(1)
21+
22+
if __name__ == "__main__":
23+
main()

src/primitive_lib/Primitive_lib.py

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/transpiler/__init__.py

Whitespace-only changes.

src/transpiler/compiler.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import ast
2+
import io
3+
import contextlib
4+
from src.transpiler.vython_parser import Parser
5+
from src.transpiler.transpiler import Transpiler
6+
7+
class Compiler:
8+
def __init__(self, vythonCode, transpile_mode, show_ast, debug_mode=False, ):
9+
self.debug_mode = debug_mode
10+
self.show_ast = show_ast
11+
self.transpile_mode = transpile_mode
12+
self.vythonCode = vythonCode
13+
self.vythonaAST = None
14+
self.pythonAST = None
15+
self.pythonCode = None
16+
self.result = None
17+
18+
def parse(self):
19+
if self.debug_mode:
20+
print(f"File Content:\n{self.vythonCode}")
21+
self.vythonaAST = Parser(debug_mode = False).parse(self.vythonCode)
22+
if self.debug_mode:
23+
print(self.vythonaAST)
24+
25+
def transpile(self):
26+
self.pythonAST = Transpiler(self.debug_mode, self.transpile_mode).transform(self.vythonaAST)
27+
if self.show_ast:
28+
print(ast.dump(self.pythonAST,False,indent=4))
29+
30+
def unparse(self):
31+
self.pythonCode = ast.unparse(self.pythonAST)
32+
if self.debug_mode:
33+
with open('output.py', 'w') as log:
34+
print("# [Unparse Python AST]",file=log)
35+
print(self.pythonCode, file=log)
36+
37+
def execute(self):
38+
output = io.StringIO()
39+
with contextlib.redirect_stdout(output):
40+
exec(self.pythonCode,globals())
41+
captured_output = output.getvalue()
42+
self.result = captured_output
43+
return self.result
44+
45+
def get_result(self):
46+
return self.result
47+
48+
def get_result_fullpath(self):
49+
self.parse()
50+
self.transpile()
51+
self.unparse()
52+
self.execute()
53+
return self.result

src/transpiler/lib_tmp/global_func/__init__.py

Whitespace-only changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
def incompat(self,value):
2+
return
3+
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# wrapされるメソッド名に変わる
2+
def tmp_method():
3+
result = self.tmpInvoke()# wrapされるメソッドの呼び出し: wrapされるメソッド名は少し変える
4+
append(result,self)
5+
return result
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__vt_init__(self)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from src.lib.primitive_lib.Primitive_Bool import Primitive_Bool_v_0
2+
from src.lib.primitive_lib.Primitive_Number import Primitive_Number_v_0
3+
from src.lib.primitive_lib.Primitive_String import Primitive_String_v_0
4+
5+
PrimitiveClasses = {Primitive_String_v_0, Primitive_Number_v_0, Primitive_String_v_0}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class Primitive_Bool_v_0():
2+
def __init__(self, value):
3+
self.value = value
4+
__vt_init__(self)
5+
6+
def __repr__(self):
7+
return f"{self.value}"
8+
9+
def __bool__(self):
10+
return self.value
11+
12+
def equal(left,right):
13+
return left.value == right.value
14+
def nequal(left,right):
15+
return left.value != right.value
16+
17+
# 検査 & VT書き換えを加える
18+
def __eq__(left,right):
19+
return left.binary(right,"eq")
20+
def __ne__(left,right):
21+
return left.binary(right,"ne")
22+
23+
def binary(left,right,op):
24+
checkCompatibility(left,right)
25+
match op:
26+
# 比較
27+
case "eq": result = Primitive_Bool_v_0(left.value == right.value)
28+
case "ne": result = Primitive_Bool_v_0(left.value != right.value)
29+
append(result,left)
30+
append(result,right)
31+
return result
32+
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
class Primitive_Number_v_0():
2+
def __init__(self, value):
3+
self.value = value
4+
__vt_init__(self)
5+
6+
def __repr__(self):
7+
return f"{self.value}"
8+
9+
def __bool__(self):
10+
return bool(self.value)
11+
12+
def __str__(self):
13+
return str(self.value)
14+
15+
def equal(left,right):
16+
return left.value == right.value
17+
def nequal(left,right):
18+
return left.value != right.value
19+
20+
def __add__(left,right):
21+
return left.binary(right,"add")
22+
def __sub__(left,right):
23+
return left.binary(right,"sub")
24+
def __mul__(left,right):
25+
return left.binary(right,"mul")
26+
def __truediv__(left,right):
27+
return left.binary(right,"div")
28+
def __floordiv__(left,right):
29+
return left.binary(right,"floordiv")
30+
def __mod__(left,right):
31+
return left.binary(right,"mod")
32+
def __eq__(left,right):
33+
return left.binary(right,"eq")
34+
def __ne__(left,right):
35+
return left.binary(right,"ne")
36+
def __lt__(left,right):
37+
return left.binary(right,"lt")
38+
def __gt__(left,right):
39+
return left.binary(right,"gt")
40+
def __le__(left,right):
41+
return left.binary(right,"le")
42+
def __ge__(left,right):
43+
return left.binary(right,"ge")
44+
45+
def __neg__(self):
46+
return self.unary("neg")
47+
def __pos__(self):
48+
return self.unary("pos")
49+
50+
def binary(left,right,op):
51+
checkCompatibility(left,right)
52+
match op:
53+
# 算術
54+
case "add": result = Primitive_Number_v_0(left.value + right.value)
55+
case "sub": result = Primitive_Number_v_0(left.value - right.value)
56+
case "mul": result = Primitive_Number_v_0(left.value * right.value)
57+
case "div": result = Primitive_Number_v_0(left.value / right.value)
58+
case "mod": result = Primitive_Number_v_0(left.value % right.value)
59+
case "floordiv": result = Primitive_Number_v_0(left.value // right.value)
60+
# 比較
61+
case "eq": result = Primitive_Bool_v_0(left.value == right.value)
62+
case "ne": result = Primitive_Bool_v_0(left.value != right.value)
63+
case "lt": result = Primitive_Bool_v_0(left.value < right.value)
64+
case "gt": result = Primitive_Bool_v_0(left.value > right.value)
65+
case "le": result = Primitive_Bool_v_0(left.value <= right.value)
66+
case "ge": result = Primitive_Bool_v_0(left.value >= right.value)
67+
append(result,left)
68+
append(result,right)
69+
return result
70+
71+
def unary(self,op):
72+
match op:
73+
case "neg": result = Primitive_Number_v_0(-self.value)
74+
case "pos": result = Primitive_Number_v_0(self.value)
75+
append(result,self)
76+
return result
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
class Primitive_String_v_0():
2+
def __init__(self, value):
3+
self.value = value
4+
__vt_init__(self)
5+
6+
def __repr__(self):
7+
return f"{self.value}"
8+
9+
def __bool__(self):
10+
return bool(self.value)
11+
12+
def __len__(self):
13+
return len(self.value)
14+
15+
def equal(left,right):
16+
return left.value == right.value
17+
def nequal(left,right):
18+
return left.value != right.value
19+
20+
def __add__(left,right):
21+
return left.binary(right,"add")
22+
def __eq__(left,right):
23+
return left.binary(right,"eq")
24+
def __ne__(left,right):
25+
return left.binary(right,"ne")
26+
def __lt__(left,right):
27+
return left.binary(right,"lt")
28+
def __gt__(left,right):
29+
return left.binary(right,"gt")
30+
def __le__(left,right):
31+
return left.binary(right,"le")
32+
def __ge__(left,right):
33+
return left.binary(right,"ge")
34+
35+
def binary(left,right,op):
36+
checkCompatibility(left,right)
37+
match op:
38+
# 連結
39+
case "add": result = Primitive_String_v_0(left.value + right.value)
40+
# 比較
41+
case "eq": result = Primitive_Bool_v_0(left.value == right.value)
42+
case "ne": result = Primitive_Bool_v_0(left.value != right.value)
43+
case "lt": result = Primitive_Bool_v_0(left.value < right.value)
44+
case "gt": result = Primitive_Bool_v_0(left.value > right.value)
45+
case "le": result = Primitive_Bool_v_0(left.value <= right.value)
46+
case "ge": result = Primitive_Bool_v_0(left.value >= right.value)
47+
append(result,left)
48+
append(result,right)
49+
return result

src/transpiler/lib_tmp/primitive_lib/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)