-
Notifications
You must be signed in to change notification settings - Fork 0
/
PySlang.py
58 lines (44 loc) · 1.75 KB
/
PySlang.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
#!/usr/bin/env python3
# PySlang
from .ast import AST
from .lexer import Lexer
from .exceptions import *
from utils import *
@export
def compile(src, filename='<string>', *, compiler, optimize=0):
try:
print(f"Source: {{\n{S(src).indent()}\n}}\n")
st = Lexer.parse_string(src)
print("Source tree:", st, sep='\n\n', end='\n\n')
ast = AST.build(st, scope=filename.join('""'))
print(f"Abstract syntax tree: {{\n{Sstr(ast).indent()}\n}}\n")
#print(f"Nodes: {pprint.pformat(list(walk_ast_nodes(ast)))}\n")
#if (optimize):
# optimize_ast(ast, validate_ast(ast), optimize)
# print(f"Optimized: {ast.code}\n")
# #print(f"Optimized Nodes: {pformat(list(walk_ast_nodes(ast)))}\n")
#ns = validate_ast(ast)
ns = {}
code = compiler.compile_ast(ast, ns, filename=filename)
print("Compiled.\n")
except SlException as ex:
if (not ex.srclines): ex.srclines = src.split('\n')
sys.exit(str(ex))
else: return code
@apmain
@aparg('file', metavar='<file.sl>', type=argparse.FileType('r'))
@aparg('-o', metavar='output', dest='output')
@aparg('-f', metavar='compiler', dest='compiler', default='sbc')#required=True)
@aparg('-O', metavar='level', help='Code optimization level', type=int)#, default=DEFAULT_OLEVEL)
def main(cargs):
filename = cargs.file.name
if (cargs.output is None and not filename.rpartition('.')[0]):
argparser.add_argument('-o', dest='output', required=True)
cargs = argparser.parse_args()
compiler = importlib.import_module('.compilers.'+cargs.compiler, package=__package__).compiler
src = cargs.file.read()
code = compile(src, filename=filename, compiler=compiler, optimize=cargs.O)
with open(cargs.output or os.path.splitext(os.path.basename(filename))[0]+compiler.ext, 'wb') as f:
f.write(code)
# by Sdore, 2021-24
# slang.sdore.me