예제 #1
0
 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."
예제 #2
0
 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))
예제 #3
0
 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))
예제 #4
0
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)
예제 #5
0
파일: jink.py 프로젝트: jink-lang/jink
      "",
      "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