-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
73 lines (54 loc) · 2.09 KB
/
main.py
File metadata and controls
73 lines (54 loc) · 2.09 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
__author__ = 'mandriy'
import argparse
import sys
from code_gen.semantic_checker import SemanticChecker
from code_gen.generator import SignalAsmGenerator
from signal_parser.parser import SignalParser
from signal_parser.term import term_to_dot
from utils.errors import dump_errors
from utils.common_utils import gen_asm_filename
from sys import stderr
args_parser = argparse.ArgumentParser(
version='1.0',
add_help=True,
prog='signalc',
epilog='Made by Andriy Melnyk.'
)
args_parser.add_argument('source_file',
metavar='source',
type=str,
help='Source file to be compiled.')
args_parser.add_argument('-o',
metavar='filename',
action='store',
dest='output_file',
help='Compiler output file.',
default=None)
args_parser.add_argument('-td',
metavar='dot filename',
action='store',
dest='tree_dot_filename',
default=None,
help='Store parser result to file in dot format.')
compiler_arguments = args_parser.parse_args(sys.argv[1:])
def say_goodbye():
print >> stderr, 'Compilation is interrupted.'
exit()
parser = SignalParser()
checker = SemanticChecker()
generator = SignalAsmGenerator()
term = parser.parse_file(compiler_arguments.source_file)
dump_errors(parser.errors())
if term is not None:
if compiler_arguments.tree_dot_filename:
term_to_dot(term).write_dot(compiler_arguments.tree_dot_filename)
if not checker.check(term):
dump_errors(checker.errors())
say_goodbye()
generated_asm_content = generator.generate(term, parser.identifiers(), parser.literals())
if compiler_arguments.output_file is None:
compiler_arguments.output_file = gen_asm_filename(compiler_arguments.source_file)
with open(compiler_arguments.output_file, 'w') as output_file:
output_file.write(generated_asm_content)
else:
say_goodbye()