#! /usr/bin/env python3 """ This file is part of pilang. pilang is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. pilang is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with pilang. If not, see . """ import sys from rtypes import goto from intern import main_class if len(sys.argv) == 1: # CLI loop # Show copyright note print("pilang Copyright (C) 2020 niansa") print("This program comes with ABSOLUTELY NO WARRANTY; for details type `warranty'.") print("This is free software, and you are welcome to redistribute it") print("under certain conditions; type `license' for details.") print("") # Initialise interpreter main = main_class() while True: print(">>> ", end="", flush=True) try: commandstr = input() except EOFError: print() sys.exit(0) except KeyboardInterrupt: print() continue try: res = main.get_rstring(main.run_command(commandstr), errorsonly=False) except goto: res = "Goto is not possible in CLI mode" except RuntimeError as error: res = error.args[0] if res != None: print(res) else: # File execution loop # Initialise interpreter main = main_class() # Parse argv if sys.argv[1] == "-c": del sys.argv[1] if len(sys.argv[1]) == 1: sys.exit(1) scriptfile = sys.argv[1] del sys.argv[0] # Save file line-by-line into list with open(scriptfile, mode="r") as f: lines = [] for line in f: if line[-1] == "\n": line = line[:-1] lines.append(line) # Execute file linenum = 0 markers = {"start": 0} while True: try: cmdres = main.get_rstring(main.run_command(lines[linenum]), errorsonly=True) linenum += 1 except RuntimeError as error: print(f"In line {linenum + 1}:", error.args[0]) sys.exit(1) except goto as gotoinstr: if gotoinstr.define: markers[gotoinstr.marker] = linenum + 1 linenum += 1 continue else: try: linenum = markers[gotoinstr.marker] except KeyError: print("Invalid goto instruction (critical)") sys.exit(3) except IndexError: break if cmdres: print(cmdres)