{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Untitled0.ipynb","version":"0.3.2","views":{},"default_view":{},"provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"metadata":{"id":"dFoPXMz7Ugov","colab_type":"code","colab":{"autoexec":{"startup":false,"wait_interval":0},"base_uri":"https://localhost:8080/","height":1018},"outputId":"f97ec1e1-cad5-4c94-ce98-f33c09e946ea","executionInfo":{"status":"error","timestamp":1531295775059,"user_tz":-480,"elapsed":285724,"user":{"displayName":"Jing-Shin Chang","photoUrl":"//lh4.googleusercontent.com/-A7syi9f8y64/AAAAAAAAAAI/AAAAAAAAABE/WSZsMSXKhO8/s50-c-k-no/photo.jpg","userId":"108986615660927390014"}}},"cell_type":"code","source":["#P3 parser 含P4的next token\n","import re\n","\n","outfile = open('P3_output.txt','w')\n","tmp_i = -1 #由於呼叫nexr_token都會將tmp_i+1所以initial為-1,此為輸入字串的index\n","token_list = [] #存抓到的token,包括他的parameter與值\n","tmp_token = \"\" #暫存token\n","flag = 0 #0為正常,1為illegal,方便之後處理\n","Next=[] #跟token_list是一樣的東西,用的地方不一樣\n","\n","\t# @(#)next_token(): 每次呼叫此function 就將傳入的input字串用regular expression做分析再依判斷式的結果\n","\t# 回傳部分字串\n","\t#\n","\t# FUNCTION:\n","\t# 1.先判斷index是否正確 \n","\t# 2.判斷是否已經抓到字串的最後一個,如果不是就繼續往下做\n","\t#\t 3.先判斷tmp_char是否為符號、字母或者數字,若遇到\"/*\"開頭的註解則跳過後面的字串\n","\t# 4.每個判斷式裡面都有各自的return,return的是當下的token和token的type(存在token_list回傳)\n","\t#\t \n","\t# INPUT:\n","\t# 使用者執行程式後自行輸入檔案名稱\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# 每個判斷式裡面都有各自的return,return的是當下的token和token的type(存在token_list回傳)\n","\t\t \n","def next_token():\n"," global t\n"," global tmp_i\n"," global token_list\n"," global i\n"," token = \"\"\n"," token_list = []\n"," if tmp_i == len(t)-1: #如果全部的token都抓完了就把token_list設為有空字串的list\n"," token_list = [\"\",\"\"]\n"," return token_list\n"," \n"," tmp_i += 1\n"," tmp_char = t[tmp_i]\n"," if re.search(\"^[\\+\\-\\>\\=\\<\\(\\)\\*]$\", tmp_char):\n"," #regular exp 從tmp_char裡尋找符合這些符號的pattern(^這個是起始符號 $結尾符號)\n"," if tmp_char == '>': #判斷目前的token是不是\">\"\n"," token += tmp_char #如果是\">\"就加到token裡\n"," if t[tmp_i+1] == '=': #前面如果是\">\"就再判斷下一個是不是\"=\"\n"," token += t[tmp_i+1] \n"," tmp_i += 1\n"," elif tmp_char == '=': #判斷目前的token是不是\"=\"\n"," token += tmp_char\n"," tmp_char = t[tmp_i+1]\n"," if tmp_char == '=': #前面如果是\"=\"就再判斷下一個是不是\"=\"\n"," token += tmp_char \n"," tmp_i += 1\n"," else:\n"," token = tmp_char\n"," token_list.append(token) #把抓到的token加到(append) token_list裡面作為return值\n"," return token_list\n"," elif re.search(\"^[a-z]$\", tmp_char):\n"," #符合a~z(或是A~Z)的pattern\n"," token = tmp_char\n"," while True:\n"," if tmp_i == len(t)-1: #如果index是最後一個就break\n"," break\n"," tmp_i += 1 \t#index不是最後一個就把index加一\n"," if re.search(\"^[a-z0-9]$\", t[tmp_i]):\n"," #index加一之後,就判斷有沒有符合a~z0~9的pattern(EX: a0,bB1,z9...)\n"," token += t[tmp_i] #如有符合pattern就加到token\n"," else :\n"," #沒有符合a~z0~9的pattern,就讓index減一,然後break出while迴圈\n"," tmp_i -= 1\n"," break\n"," token_list.append(\"id\") #這裡是符合\"id\"這個pattern的,append到token_list\n"," token_list.append(token) #把抓到的token加到(append) token_list裡面作為return值\n"," return token_list\n"," elif re.search(\"^[0-9]$\", tmp_char) :\n"," #符合數字0~9的pattern\n"," token += tmp_char\n"," while True:\n"," if tmp_i == len(t)-1: #如果index是最後一個就break\n"," break\n"," tmp_i += 1 \t#index不是最後一個就把index加一\n"," tmp_char = t[tmp_i]\n"," if re.search(\"^[0-9]$\", tmp_char): #繼續判斷是不是數字0~9\n"," token += tmp_char\n"," else :\n"," #沒有符合0~9的pattern,就讓index減一,然後break出while迴圈\n"," tmp_i -= 1\n"," break\n"," token_list.append(\"num\") #這裡是符合\"num\"這個pattern的,append到token_list\n"," token_list.append(token) #把抓到的token加到(append) token_list裡面作為return值\n"," return token_list\n"," elif tmp_char == '/':\n"," if t[tmp_i+1] == '*':\n"," #遇到/*開頭表示為註解 字串取到前面的部分就好\n"," t = t[0:tmp_i]\n"," tmp_i -= 1\n"," return \" \"\n","\n","\t# @(#)match(k): 每次呼叫此function 就將傳入的字串跟token比較是否相符合\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.先判斷傳入的字串跟token比較是否相符合\n","\t# 2.再判斷flag這個變數是否為0(1為illegal時,0則legal)\n","\t#\t 3.再判斷當前match到的是哪種type(id,num,符號),此為當前match進度\n","\t# 4.呼叫next_token()抓下一個token\n","\t# 5.return True代表文法正確,False則是文法錯誤\n","\t#\t \n","\t# INPUT:\n","\t# 呼叫此function時傳入的參數值\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n","\n","def match(k):\n"," global lookahead\n"," global tmp_token\n"," global flag\n"," global Next\n"," global outfile\n"," if lookahead == k: #判斷其他副程式在呼叫match()時,傳進來的字串是否與token一樣\n"," if flag == 0: \t#flag是在有illegal文法的時候會變成1其餘都是0 \n"," if lookahead == \"num\" or lookahead == \"id\": #如果token現在match到的是id或是num就把pattern跟它的值print出來\n"," print(\"此時match到\", lookahead, Next[-1])\n"," print(\"此時match到\", lookahead, Next[-1],file = outfile)\n"," \n"," else:\n"," print(\"此時match到\",lookahead) #如果token現在match到的是符號就把它print出來\n"," print(\"此時match到\",lookahead,file = outfile)\n"," Next = next_token() #用來存return回來的list\n"," lookahead = Next[0] #取list的index[0](代表是pattern)\n"," tmp_token += Next[-1] #取list最後一項(num或id的值以及符號) 用來存有illegal文法時停下來的地方\n"," return True\n"," else:\n"," return False\n","\n","\t# @(#)factor(): 判斷factor根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷是否match到\"(\",再判斷expr()是否為True,再判斷是否match到\")\",都成立return True\n","\t# 2.判斷是否為num的type,return True\n","\t#\t 3.判斷是否為id的type,return True\n","\t# 4.如果上述判斷式皆不成立,代表文法有誤,return False\n","\t# 5.return True代表文法正確,False則是文法錯誤\n","\t# 6.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n","\n","def factor():\n"," global flag\n"," global outfile\n"," print(\"matching factor()\")\n"," print(\"matching factor()\",file = outfile)\n"," if match(\"(\"): #如果match(\"(\")左括號的值是True就往下判斷\n"," if expr(): #如果expr()是True就再往下判斷\n"," if match(\")\"): #如果match(\")\")右括號的值是True代表factor -> (expr)這個文法是正確的,此次match有符合\n"," print(\"factor -> (expr) OK\")\n"," print(\"factor -> (expr) OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," flag = 1 #文法有錯flag改為1\n"," return False\n"," elif match(\"num\"): #如果match(\"num\")的值是True代表factor -> num這個文法是正確的,此次match有符合\n"," print(\"factor -> num OK\")\n"," print(\"factor -> num OK\",file = outfile)\n"," return True\n"," \n"," elif match(\"id\"): #如果match(\"id\")的值是True代表factor -> id這個文法是正確的,此次match有符合\n"," print(\"factor -> id OK\")\n"," print(\"factor -> id OK\",file = outfile)\n"," return True\n"," \n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n","\n","\n","\t# @(#)term_R(): 判斷term_R根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷是否match到\"*\",如果沒有match到\"*\",則文法符合term_R -> ε\n","\t# 2.如果match到\"*\",再判斷factor()是否為True,再判斷term_R()是否為True,都成立return True\n","\t# 3.如果第2點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 4.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n"," \n","def term_R():\n"," global flag\n"," global outfile\n"," print(\"matching trem_R()\")\n"," print(\"matching trem_R()\",file = outfile)\n"," if match(\"*\"): #如果match(\"*\")的值是True就往下判斷\n"," if factor(): #如果factor()的值是True就再往下判斷\n"," if term_R(): #如果term_R()的值是True代表term_R -> * factor term_R這個文法是正確的,此次match有符合\n"," print(\"term_R -> * factor term_R OK\")\n"," print(\"term_R -> * factor term_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #代表此時的文法是term_R -> ε\n"," print(\"term_R -> ε OK\")\n"," print(\"term_R -> ε OK\",file = outfile)\n"," return 1\n","\n","\t# @(#)term(): 判斷term根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷factor()以及term_R()的回傳值,分別存在F、T_R兩個變數中,\n","\t# 2.再判斷True或False\n","\t# 3.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n"," \n","def term():\n"," global flag\n"," global outfile\n"," print(\"matching term()\")\n"," print(\"matching term()\",file = outfile)\n"," F = factor() #儲存呼叫factor()後return的值\n"," T_R = term_R() #儲存呼叫term_R()後return的值\n"," if (F == True) & (T_R == True): #都是True表示term -> factor term_R這個文法正確,此次match有符合\n"," print(\"term -> factor term_R OK\")\n"," print(\"term -> factor term_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n","\n","\n","\t# @(#)add_R(): 判斷add_R根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷是否match到\"+\",如果沒有match到\"+\",則文法符合add_R -> ε\n","\t# 2.如果match到\"+\",再判斷term()是否為True,再判斷add_R()是否為True,都成立return True\n","\t# 3.如果第2點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 4.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n","\n","def add_R():\n"," global flag\n"," global outfile\n"," print(\"matching add_R\")\n"," print(\"matching add_R\",file = outfile)\n"," if match(\"+\"): #如果match(\"+\")的值是True就往下判斷\n"," if term(): #如果term()的值是True就再往下判斷\n"," if add_R(): #如果add_R()的值是True代表add_R -> + term add_R這個文法是正確的,此次match有符合\n"," print(\"add_R -> + term add_R OK\")\n"," print(\"add_R -> + term add_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else:\n"," print(\"add_R -> ε OK\")\n"," print(\"add_R -> ε OK\",file = outfile)\n"," return 1\n","\n","\n","\t# @(#)add(): 判斷add根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷term()以及add_R()的回傳值,分別存在T、A_R兩個變數中,\n","\t# 2.再判斷True或False\n","\t# 3.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n"," \n","def add():\n"," global flag\n"," global outfile\n"," print(\"matching add()\")\n"," print(\"matching add()\",file = outfile)\n"," T = term() #儲存呼叫term()後return的值\n"," A_R = add_R() #儲存呼叫add_R()後return的值\n"," if (T == True) & (A_R == True): #都是True表示add -> term add_R這個文法正確,此次match有符合\n"," print(\"add -> term add_R OK\")\n"," print(\"add -> term add_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n","\n","\n","\t# @(#)rel_R(): 判斷rel_R根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷是否match到\"<\",如果沒有match到\"<\",再判斷是否match到\"==\",如果沒有match到\"==\",\n","\t#\n"," #再判斷是否match到\">=\",如果都沒有match則文法屬於rel_R -> ε\n","\t# 2.如果match到\"<\",再判斷add()是否為True,再判斷rel_R()是否為True,都成立return True,\n","\t# 如果第2點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 3.如果match到\"==\",再判斷add()是否為True,再判斷rel_R()是否為True,都成立return True,\n","\t# 如果第3點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 4.如果match到\">=\",再判斷add()是否為True,再判斷rel_R()是否為True,都成立return True,\n","\t# 如果第4點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 5.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n","\n","def rel_R():\n"," global flag\n"," global outfile\n"," print(\"matching rel_R()\")\n"," print(\"matching rel_R()\",file = outfile)\n"," if match(\"<\"): #如果match(\"<\")的值是True就往下判斷\n"," if add(): #如果add()的值是True就再往下判斷\n"," if rel_R(): #如果rel_R()的值是True代表rel_R -> < add rel_R這個文法是正確的,此次match有符合\n"," print(\"rel_R -> < add rel_R OK\")\n"," print(\"rel_R -> < add rel_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," elif match(\"==\"): #如果match(\"==\")的值是True就往下判斷\n"," if add(): #如果add()的值是True就再往下判斷\n"," if rel_R(): #如果rel_R()的值是True代表rel_R -> == add rel_R這個文法是正確的,此次match有符合\n"," print(\"rel_R -> == add rel_R OK\")\n"," print(\"rel_R -> == add rel_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," elif match(\">=\"): #如果match(\">=\")的值是True就往下判斷\n"," if add(): #如果add()的值是True就再往下判斷\n"," if rel_R(): #如果rel_R()的值是True代表rel_R -> >= add rel_R這個文法是正確的,此次match有符合\n"," print(\"rel_R -> >= add rel_R OK\")\n"," print(\"rel_R -> >= add rel_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else:\n"," print(\"rel_R -> ε OK\")\n"," print(\"rel_R -> ε OK\",file = outfile)\n"," return 1\n","\n","\n","\t# @(#)rel(): 判斷rel根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷add()以及rel_R()的回傳值,分別存在A、R_R兩個變數中,\n","\t# 2.再判斷True或False\n","\t# 3.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n"," \n","def rel():\n"," global flag\n"," global outfile\n"," print(\"matching rel()\")\n"," print(\"matching rel()\",file = outfile)\n"," A = add() #儲存呼叫add()後return的值\n"," R_R = rel_R() #儲存呼叫rel_R()後return的值\n"," if (A == True) & (R_R == True): #都是True表示rel -> add rel_R這個文法正確,此次match有符合\n"," print(\"rel -> add rel_R OK\")\n"," print(\"rel -> add rel_R OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n","\n","\n","\t# @(#)expr(): 判斷expr根據grammar G1往下展開是符合哪種文法\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.判斷rel()的回傳值是否為True\n","\t# 2.再判斷是否match\"=\",如果沒有match\"=\",表示文法符合expr -> rel\n","\t# 3.如果有match\"=\",再判斷expr()回傳值是否為True,都成立return True\n","\t# 4.如果第3點判斷式其中之一不成立,代表文法有誤,return False\n","\t# 5.print出match進度\n","\t#\t \n","\t# INPUT:\n","\t# NONE!\n","\t# OUTPUT: \n","\t#\t NONE!\n","\t#\t \n","\t# RETURN:\n","\t# return文法正確與否\n","\n"," \n","def expr():\n"," global flag\n"," global tmp_token\n"," global outfile\n"," print(\"matching expr()\")\n"," print(\"matching expr()\",file = outfile)\n"," if rel(): #如果rel()的值是True就往下判斷\n"," if match(\"=\"): #如果match(\"=\")的值是True就再往下判斷\n"," if expr(): #如果expr()的值是True代表expr -> rel = expr這個文法是正確的,此次match有符合\n"," print(\"expr -> rel = expr OK\")\n"," print(\"expr -> rel = expr OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n"," else: #如果rel()為True後沒有\"=\",代表expr -> rel這個文法是正確的,此次的match有符合\n"," print(\"expr -> rel OK\")\n"," print(\"expr -> rel OK\",file = outfile)\n"," return True\n"," else: #文法有錯flag改為1\n"," flag = 1\n"," return False\n","\n","\n","\t# @(#)main(): 讓使用者輸入需要傳入的input file,並讀取檔案內容,再加以處理,以及輸出最終結果\n","\t# \n","\t#\n","\t# FUNCTION:\n","\t# 1.讓使用者自行輸入檔案名稱\n","\t# 2.利用迴圈讀取檔案內容(一次讀取一行)\n","\t# 3.將參數初始化,並處理字串(將字串裡的空白去除)\n","\t# 4.呼叫next_token()以及expr()往下展開\n","\t# 5.顯示最終結果(成功或失敗)\n","\t#\t \n","\t# INPUT:\n","\t# 使用者輸入的檔案名稱\n","\t# OUTPUT: \n","\t#\t 最終結果(文法正確與否)\n","\t#\t \n","\t# RETURN:\n","\t# NONE!\n","\n","\n","def main():\n"," global tmp_i\n"," global t\n"," global lookahead\n"," global tmp_token\n"," global Next\n"," global flag\n"," global outfile\n"," filename = input(\"Please enter your input file name:\")\n"," linenum = 0\n"," for line in open(filename):\n"," linenum += 1\n"," f = open(filename,\"r\")\n"," for i in range(linenum):\n","\n"," tmp_i = -1\n","\n"," tmp_token = \"\"\n"," flag = 0\n"," Next=[]\n"," \n"," text = f.readline()\n"," t = text[0:-1].replace(' ','')\n"," Next = next_token()\n"," lookahead = Next[0]\n"," tmp_token = Next[-1]\n"," \n"," print(\"此時的字串:\", t)\n"," print(\"此時的字串:\", t,file = outfile)\n"," E = expr()\n"," t = \"\"\n"," text = \"\"\n"," if E == True: #全部的文法都正確\n"," print(\"Success!!!\")\n"," print(\"Success!!!\",file = outfile)\n"," elif E == False: #文法有錯,並把停下的地方顯示出來\n"," print(\"Failed\")\n"," print(\"Failed\",file = outfile)\n"," print(\"Parsing stops at : \", tmp_token)\n"," print(\"Parsing stops at : \", tmp_token,file = outfile)\n"," print()\n"," print(file = outfile)\n"," outfile.close()\n"," f.close()\n","\n","\n","\n","\n","main()\n"],"execution_count":1,"outputs":[{"output_type":"error","ename":"KeyboardInterrupt","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 729\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 730\u001b[0;31m \u001b[0mident\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreply\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstdin_socket\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 731\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mException\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/jupyter_client/session.py\u001b[0m in \u001b[0;36mrecv\u001b[0;34m(self, socket, mode, content, copy)\u001b[0m\n\u001b[1;32m 802\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 803\u001b[0;31m \u001b[0mmsg_list\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv_multipart\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmode\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 804\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mzmq\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mZMQError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/zmq/sugar/socket.py\u001b[0m in \u001b[0;36mrecv_multipart\u001b[0;34m(self, flags, copy, track)\u001b[0m\n\u001b[1;32m 394\u001b[0m \"\"\"\n\u001b[0;32m--> 395\u001b[0;31m \u001b[0mparts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrecv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mflags\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtrack\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtrack\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 396\u001b[0m \u001b[0;31m# have first part already, only loop while more to receive\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.recv\u001b[0;34m()\u001b[0m\n","\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket.Socket.recv\u001b[0;34m()\u001b[0m\n","\u001b[0;32mzmq/backend/cython/socket.pyx\u001b[0m in \u001b[0;36mzmq.backend.cython.socket._recv_copy\u001b[0;34m()\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/zmq/backend/cython/checkrc.pxd\u001b[0m in \u001b[0;36mzmq.backend.cython.checkrc._check_rc\u001b[0;34m()\u001b[0m\n","\u001b[0;31mKeyboardInterrupt\u001b[0m: ","\nDuring handling of the above exception, another exception occurred:\n","\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 548\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 549\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 550\u001b[0;31m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;32m\u001b[0m in \u001b[0;36mmain\u001b[0;34m()\u001b[0m\n\u001b[1;32m 508\u001b[0m \u001b[0;32mglobal\u001b[0m \u001b[0mflag\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 509\u001b[0m \u001b[0;32mglobal\u001b[0m \u001b[0moutfile\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 510\u001b[0;31m \u001b[0mfilename\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0minput\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Please enter your input file name:\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 511\u001b[0m \u001b[0mlinenum\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 512\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mline\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mopen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36mraw_input\u001b[0;34m(self, prompt)\u001b[0m\n\u001b[1;32m 703\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_ident\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 704\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_parent_header\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 705\u001b[0;31m \u001b[0mpassword\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 706\u001b[0m )\n\u001b[1;32m 707\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.6/dist-packages/ipykernel/kernelbase.py\u001b[0m in \u001b[0;36m_input_request\u001b[0;34m(self, prompt, ident, parent, password)\u001b[0m\n\u001b[1;32m 733\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 734\u001b[0m \u001b[0;31m# re-raise KeyboardInterrupt, to truncate traceback\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 735\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyboardInterrupt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 736\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 737\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mKeyboardInterrupt\u001b[0m: "]}]}]}