def test_math(self): """Ensures arithmetic is evaluated properly.""" code = "4 + 2 / 2" tokens = self.lexer.parse(code) parsed = optimize(self.parser.parse(tokens)) evaluated = self.interpreter.evaluate(parsed, self.env)[0] assert evaluated == 5, "Issue in arithmetic evaluation."
def run(self, code): try: lexed = self.lexer.parse(code) if len(lexed) == 1 and lexed[0].type == 'ident': var = self.env.get_var(lexed[0].text) ret = var['value'] if var != None and isinstance( var, (dict)) else var or 'null' print(ret) else: AST = optimize(self.parser.parse(lexed)) e = self.interpreter.evaluate(AST, self.env) if len(e) == 1: print(e[0] if e[0] is not None else 'null') else: print(e[0] if e[0] is not None else 'null') except Exception as exception: print("Exception: {}".format(exception))
def run(self, code): if code == 'exit': sys.exit(0) try: lexed = self.lexer.parse(code) if len(lexed) == 1 and lexed[0].type == TokenType.IDENTIFIER: var = self.env.get_var(lexed[0].value) ret = var['value'] if var != None and isinstance( var, (dict)) else var or 'null' print(ret) else: AST = optimize(self.parser.parse(lexed, verbose=self.verbose)) e = self.interpreter.evaluate(AST, self.env) if len(e) == 1: print(e[0] if e[0] is not None else 'null') else: print(e[0] if e[0] is not None else 'null') except Exception as exception: print("Exception: {}".format(exception))
import sys from jink.lexer import Lexer from jink.parser import Parser from jink.optimizer import optimize from jink.interpreter import Interpreter from jink.utils.classes import Environment lexer = Lexer() parser = Parser() interpreter = Interpreter() code = '' if len(sys.argv) > 1: if not sys.argv[1].endswith('.jk'): sys.argv[1] += '.jk' code = open(sys.argv[1]).read() else: raise Exception("File path not given.") if not code: raise Exception("Error in file reading.") env = Environment() env.def_func('print', lambda scope, args: print('\n'.join([str(x) for x in args]) or 'null')) env.def_func('string', lambda args: [str(x or 'null') for x in args][0] if len(args) == 1 else [str(x or 'null') for x in args]) AST = optimize(parser.parse(lexer.parse(code))) interpreter.evaluate(AST, env)
"", "args:", " > -v -- verbose; will output AST." # and if compiling, both optimized and unoptimized LLVM IR.", # " > -c -- compile; will use compiler instead of interpreter." "", "usage:", " > [jink] help -- shows this prompt.", " > [jink] path/to/file[.jk] -- executes interpreter on file.", " > [jink] -v path/to/file[.jk] -- executes interpreter on file verbose mode.", # " > [jink] -c path/to/file[.jk] -- executes compiler on file.", # " > [jink] -c -v path/to/file[.jk] -- executes compiler on file in verbose mode.", " > [jink] -- launches interpreted interactive REPL.", " > [jink] -v -- launches interpreted interactive REPL in verbose mode." ])) else: path = ' '.join(sys.argv) code = get_code_from_path(path) if to_compile: raise NotImplementedError("Compiler not yet implemented.") # Compiler()._eval(code, optimize=True, verbose=verbose) else: AST = optimize(Parser().parse(Lexer().parse(code), verbose=verbose)) env = Environment() env.add_builtins() Interpreter().evaluate(AST, env) if __name__ == "__main__": pass