#! python3 import os import pathlib import sys from jinja2 import Environment, FileSystemLoader from parser import * def main(): if len(sys.argv) != 2: sys.exit("Takes name of file.") filename = sys.argv[1] filebase = os.path.basename(filename) ast = None with open(filename, mode='r') as f: filedata = f.read() lexemes = lexer(filedata) parser = Parser(lexemes) ast = parser.parse() type_check(ast) messages = [m for m in ast if type(m) is Message] interfaces = [i for i in ast if type(i) is Interface] # We know there is only one package decl from the type_check. packages = [p for p in ast if type(p) is Package] package = None if len(packages) == 1: package = packages[0] jinja_env = Environment(loader=FileSystemLoader(pathlib.Path(__file__).parent.resolve())) message_header_tmpl = jinja_env.get_template("message.h.jinja") message_header_tmpl.globals['Type'] = Type with open(filename + '.h', mode='w') as f: message_header = message_header_tmpl.render(messages=messages, package=package) f.write(message_header) message_impl_tmpl = jinja_env.get_template("message.cpp.jinja") message_impl_tmpl.globals['Type'] = Type with open(filename + '.cpp', mode='w') as f: message_impl = message_impl_tmpl.render(file=filebase, messages=messages, package=package) f.write(message_impl) if len(interfaces) == 0: return client_header_tmpl = jinja_env.get_template("client.h.jinja") with open(filename + '.client.h', mode='w') as f: client_header = client_header_tmpl.render(file=filebase, interfaces=interfaces, package=package) f.write(client_header) client_impl_tmpl = jinja_env.get_template("client.cpp.jinja") with open(filename + '.client.cpp', mode='w') as f: client_impl = client_impl_tmpl.render(file=filebase, interfaces=interfaces, package=package) f.write(client_impl) server_header_tmpl = jinja_env.get_template("server.h.jinja") with open(filename + '.server.h', mode='w') as f: server_header = server_header_tmpl.render(file=filebase, interfaces=interfaces, package=package) f.write(server_header) server_impl_tmpl = jinja_env.get_template("server.cpp.jinja") with open(filename + '.server.cpp', mode='w') as f: server_impl = server_impl_tmpl.render(file=filebase, interfaces=interfaces, package=package) f.write(server_impl) if __name__ == "__main__": main()