構文解析!!(自分の力で!)
前にAOJで構文解析の問題が合って、やり方が全く分かりませんでした。
まぁ、なんやかんやでタコスさん(先輩)やかがさん(先輩)やきゅうりさん(先輩)に
『構文解析ってどうやるんですか?』って聞いた所、
タコスさん『部活にこい』
かがさん(結構前だけど)『まだやってない。』
きゅうりさん『…。』
というわけで、部活に行ってもあまり意味がないと分かっていた僕は、
Pythonで構文解析してやろうと思いまして、 Google先生に頼もうと思いました。
( ๑・ิټ・ิ๑)(僕):『これ…。むずくね?』
そうです。僕は 人のソースを見ることになれていないのです(見たくないのです)
だから、
٩( ๑╹ ꇴ╹)۶『ヲワタ』
ってなって、放棄。
けど、最近、構文解析ってプログラマとして必要なんかなぁ。て思って、
書いちゃえ。って思って、
今日学校土砂降りの雨の中 構文解析の考え方を考えて(日本語おかしいw)、
家にかえって、Pythonでがちゃがちゃ書いてみました。
じゃあ結構早くかけて、『(・∀・)イイ!!』って一人で。
頭がおかしいので、例外処理を使った、ソースにしましたw
これです。
http://ideone.com/EHpmP7
えっと、while True にすれば、いくらでも入れれるので、あとで書き直します。
きゅうりさんから
『 たしかにすげぇソース汚いけど合ってそう。この、優先度順に左右を評価していって削っていく感じオーソドックスな手法ですがなかなかバグ出さずに実装するの大変なのでよく実装できたなあと思いました。(が、やはり構文解析だけはちょっと知識入れることをオススメします。)』
Twitterより返事。
構文解析の勉強します。
なんどでもかける奴です。
while True: try: a = raw_input(); b=[] ; i = 0 while True: try: if len(a) == 1: b.append(int(a[0:])); break if a == "": break g= int(a[i]) i+=1 except IndexError: b.append(int(a[0:])); break except ValueError: if a =="": break b.append(int(a[:i])) b.append(a[i]) a=a.replace(a[:i+1],"",1) i=0 i = 0 ;ans=0 while True: if "*" in b: g=b.index("*") ans+=b[g-1]*b[g+1] ; q = b[g-1]*b[g+1] b[g] =q ; del b[g+1] ; del b[g-1] if "/" in b: g=b.index("/") ans+=float(b[g-1])/b[g+1] ; q = float(b[g-1])/b[g+1] b[g] =q ; del b[g+1] ; del b[g-1] elif "+" in b: g=b.index("+") ans+=(b[g-1])+b[g+1] ; q = (b[g-1])+b[g+1] b[g] =q ; del b[g+1] ; del b[g-1] elif "-" in b: g=b.index("-") ans+=(b[g-1])-b[g+1] ; q = (b[g-1])-b[g+1] b[g] =q ; del b[g+1] ; del b[g-1] if len(b) == 1: print b[0] break except EOFError: break
汚いとか言わないの。