Advertisement
Guest User

Fish interpreter

a guest
Aug 25th, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.99 KB | None | 0 0
  1. import sys
  2. from random import randint
  3.  
  4. file = sys.argv[1]
  5. code = open(file)
  6. program = code.read()
  7.  
  8. print(str(program))
  9.  
  10. #--------------#
  11. #Initialization#
  12. #--------------#
  13.  
  14. stdin = sys.argv[2]
  15. prgmlist = program.splitlines()
  16. length = len(prgmlist)
  17. prgm = {}
  18. for x in range(0,length-1):
  19.     prgm[x+1] = list(prgmlist[x])
  20. stacks, str1, str2, cmdx, cmdy, face, register, cmd = {"now":[]}, 0, 0, 0, 1, "E", 0, None
  21. strparse1, strparse2 = 0, 0
  22.  
  23. #---------#
  24. #Functions#
  25. #---------#
  26.  
  27. #Move pointer forward#
  28. def forward(facing):
  29.     global cmdx
  30.     global cmdy
  31.     if facing == "N":
  32.         cmdy += 1
  33.     if facing == "E":
  34.         cmdx += 1
  35.     if facing == "S":
  36.         cmdy -= 1
  37.     if facing == "W":
  38.         cmdx -= 1
  39.  
  40. #Execute code under pointer#
  41. def evaluate(cmd):
  42.     print(cmd)
  43.     global face
  44.     global strparse1
  45.     global strparse2
  46.     global str1
  47.     global str2
  48.     global cmdx
  49.     global cmdy
  50.     global register
  51.     global stacks
  52.    
  53.     #String parsing#
  54.     if cmd == '"':
  55.         if strparse1 == 0:
  56.             strparse1 = 1
  57.         elif strparse1 == 1:
  58.             strparse1 = 0
  59.     elif strparse1 == 1 and not cmd == '"':
  60.         stacks["now"].insert(0,cmd)
  61.     elif cmd == "'":
  62.         if strparse2 == 0:
  63.             strparse2 = 1
  64.         elif strparse2 == 1:
  65.             strparse2 = 0
  66.     elif strparse2 == 1 and not cmd == "'":
  67.         stacks["now"].insert(0,cmd)
  68.    
  69.     #Flow#
  70.     elif cmd == "^":
  71.         face = "N"
  72.     elif cmd == ">":
  73.         face = "E"
  74.     elif cmd == "v":
  75.         face = "S"
  76.     elif cmd == "<":
  77.         face = "W"
  78.     elif cmd == "|":
  79.         if face == "E":
  80.             face = "W"
  81.         elif face == "W":
  82.             face = "E"
  83.     elif cmd == "_":
  84.         if face == "N":
  85.             face = "S"
  86.         elif face == "S":
  87.             face = "N"
  88.     elif cmd == "/":
  89.         if face == "N":
  90.             face = "E"
  91.         elif face == "E":
  92.             face = "N"
  93.         elif face == "S":
  94.             face = "W"
  95.         elif face == "W":
  96.             face = "S"
  97.     elif cmd == "\\":
  98.         if face == "N":
  99.             face = "W"
  100.         elif face == "E":
  101.             face = "S"
  102.         elif face == "S":
  103.             face = "E"
  104.         elif face == "W":
  105.             face = "N"
  106.     elif cmd == "x":
  107.         rand = randint(1,4)
  108.         if rand == 1:
  109.             face = "N"
  110.         if rand == 2:
  111.             face = "E"
  112.         if rand == 3:
  113.             face = "S"
  114.         if rand == 4:
  115.             face = "W"
  116.     elif cmd == "!":
  117.         forward(face)
  118.     elif cmd == "?":
  119.         if stack[0] == 0:
  120.             forward()
  121.     elif cmd == ".":
  122.         cmdx = stacks["now"][0]
  123.         cmdy = stacks["now"][1]
  124.         stacks["now"].pop[0]
  125.         stacks["now"].pop[0]
  126.  
  127.     #Ops#
  128.     elif cmd == "+":
  129.         stacks["now"].insert(0,stacks["now"][1] + stacks["now"][0])
  130.         stacks["now"].pop[1]
  131.         stacks["now"].pop[1]
  132.     elif cmd == "-":
  133.         stacks["now"].insert(0,stacks["now"][1] - stacks["now"][0])
  134.         stacks["now"].pop[1]
  135.         stacks["now"].pop[1]
  136.     elif cmd == "*":
  137.         stacks["now"].insert(0,stacks["now"][1] * stacks["now"][0])
  138.         stacks["now"].pop[1]
  139.         stacks["now"].pop[1]
  140.     elif cmd == ",":
  141.         stacks["now"].insert(0,stacks["now"][1] / stacks["now"][0])
  142.         stacks["now"].pop[1]
  143.         stacks["now"].pop[1]
  144.     elif cmd == "%":
  145.         stacks["now"].insert(0,stacks["now"][1] % stacks["now"][0])
  146.         stacks["now"].pop[1]
  147.         stacks["now"].pop[1]
  148.  
  149.     #Conditional mods#
  150.     elif cmd == "=":
  151.         if stacks["now"][0] == stacks["now"][1]:
  152.             stacks["now"].pop[0]
  153.             stacks["now"].pop[0]
  154.             stacks["now"].insert(0,1)
  155.         else:
  156.             stacks["now"].pop[0]
  157.             stacks["now"].pop[0]
  158.             stacks["now"].insert(0,0)
  159.     elif cmd == "(":
  160.         if stacks["now"][1] < stacks["now"][0]:
  161.             stacks["now"].pop[0]
  162.             stacks["now"].pop[0]
  163.             stacks["now"].insert(0,1)
  164.         else:
  165.             stacks["now"].pop[0]
  166.             stacks["now"].pop[0]
  167.             stacks["now"].insert(0,0)
  168.     elif cmd == ")":
  169.         if stacks["now"][1] > stacks["now"][0]:
  170.             stacks["now"].pop[0]
  171.             stacks["now"].pop[0]
  172.             stacks["now"].insert(0,1)
  173.         else:
  174.             stacks["now"].pop[0]
  175.             stacks["now"].pop[0]
  176.             stacks["now"].insert(0,0)
  177.  
  178.     #String parsing#
  179.     elif cmd == '"':
  180.         if strparse1 == 0:
  181.             strparse1 = 1
  182.         elif strparse1 == 1:
  183.             strparse1 = 0
  184.     elif cmd == "'":
  185.         if strparse2 == 0:
  186.             strparse2 = 1
  187.         elif strparse2 == 1:
  188.             strparse2 = 0
  189.  
  190.     #Stack manipulation#
  191.     elif cmd == ":":
  192.         stacks["now"][0] + stacks["now"]
  193.     elif cmd == "~":
  194.         stacks["now"].pop[0]
  195.     elif cmd == "$":
  196.         stack0 = stacks["now"][1]
  197.         stack1 = stacks["now"][0]
  198.         stacks["now"][0] = stack0
  199.         stacks["now"][1] = stack1
  200.     elif cmd == "@":
  201.         stack0 = stacks["now"][1]
  202.         stack1 = stacks["now"][2]
  203.         stack2 = stacks["now"][0]
  204.         stacks["now"][0] = stack0
  205.         stacks["now"][1] = stack1
  206.         stacks["now"][2] = stack2
  207.     elif cmd == "{":
  208.         lowstack = len(stacks["now"]) - 1
  209.         stacks["now"].append[stacks["now"][0]]
  210.         stacks["now"].pop[0]
  211.     elif cmd == "}":
  212.         lowstack = len(stacks["now"]) - 1
  213.         stacks["now"].insert(0,stacks["now"][lowstack])
  214.         stacks["now"].pop[0](lowstack + 1)
  215.     elif cmd == "r":
  216.         stack = list(reversed(stacks["now"]))
  217.     elif cmd == "l":
  218.         stacks["now"].insert(0,len(stacks["now"]))
  219.     elif cmd == "[":
  220.         param = stacks["now"][0]
  221.         stacks["now"].pop[0]
  222.         for x in range(0,param):
  223.             newstack = newstack.append[stacks["now"][0]]
  224.             stacks["now"].pop[0]
  225.         stacks[len(stacks)] = stacks["now"]
  226.         newstack
  227.     elif cmd == "]":
  228.         stacks["now"].insert(0,stacks["now"][len(stacks)])
  229.         "".join(stacks["now"])
  230.         stacks.stacks["now"].pop[0](len(stacks), None)
  231.  
  232.     #Input and output#
  233.     elif cmd == "o":
  234.         sys.stdout.write(chr(stacks["now"][0]))
  235.     elif cmd == "n":
  236.         sys.stdout.write(int(stacks["now"][0]))
  237.     elif cmd == "i":
  238.         stacks["now"].insert(0,stdin.read())
  239.  
  240.     #Literals#
  241.     elif cmd in range(0,9):
  242.         stacks["now"].insert(0,int(cmd))
  243.     elif cmd == "a":
  244.         stacks["now"].insert(0,10)
  245.     elif cmd == "b":
  246.         stacks["now"].insert(0,11)
  247.     elif cmd == "c":
  248.         stacks["now"].insert(0,12)
  249.     elif cmd == "d":
  250.         stacks["now"].insert(0,13)
  251.     elif cmd == "e":
  252.         stacks["now"].insert(0,14)
  253.     elif cmd == "f":
  254.         stacks["now"].insert(0,15)
  255.  
  256.     #Other#
  257.     elif cmd == " ":
  258.         dummy = 1
  259.     elif cmd == "&":
  260.         register = stacks["now"][0]
  261.         stacks["now"].pop[0]
  262.  
  263. while cmd != ";":
  264.     evaluate(cmd)
  265.     forward(face)
  266.     cmd = prgm[cmdy][cmdx]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement