構文解析!part 3.1
昨日は”==”だけでしたが、今日は”!=”機能も付け加えました。
結構この書き方に満足してます。
あと、とある東大生にclassで書いたほうがいいって言われたのでpart4.0にはclassで書きます。
Test Case
10 == 10 != 5 10 != 5 == 5 10 != 10 == 10 exit
Response
>>True >>True >>False End...
Source Code:
def factor(begin): global SyntaxFlag global i val = 0 if begin[i] == "(": i+=1 val = expression(begin) i+=1 while begin[i].isdigit(): SyntaxFlag=0 val *= 10 val += int(begin[i]) i+=1 return val def mul(begin): global i val = factor(begin) while True: if begin[i] is "*": if begin[i+1] is "*": i += 2 val **= mul(begin)#factor(begin) else: return val else: break return val def term(begin): global i val = mul(begin) #factor(begin) while True: if begin[i] is "*": i += 1 val *= mul(begin) elif begin[i] is "/": i += 1 val2 = mul(begin) if val < 0 or val2 < 0: val = func1(str(abs2(val,val2))) else: val /= 1.0*val2 val = func1(str(val)) elif begin[i] is "%": i += 1 val %= mul(begin) else: break return val def expression(begin): global i val = term(begin) while True: if begin[i] is "+": i += 1 val += expression(begin) elif begin[i] is "-": i += 1 val -= expression(begin) else: break return val def judge(begin): global i stack =[] while begin[i] != "~": val = expression(begin) if begin[i] == "=": if begin[i+1] == "=": i+=2 stack.append(val) stack.append('=') elif begin[i] == "!": i+=2 stack.append(val) stack.append('!') else: stack.append(val) break if len(stack)==1: return val else: #return True if sum(stack)*1.0/len(stack)==stack[0] else False #[50, '=', 10, '!', 5] val = True for x,y in enumerate(stack): if x%2: #print("y:",y,stack[x-1],stack[x+1]) if y is "=": if (stack[x-1] == stack[x+1]) == False: val = False break else: if (stack[x-1] != stack[x+1]) == False: val = False break return val #-3/2 == -2 abs2 = lambda x,y: int(x*1.0/y) func1 = lambda x: float(x[0:x.index('.')+3]) def main(): while True: try: ex="" global SyntaxFlag SyntaxFlag=1 tmp = (raw_input(">>")+"~").split() for j in tmp: ex+=j if True in [ex == x for x in ['exit~','quit~']]: print "End..." exit(0) elif ex=="~": continue global i i = 0 #print expression(ex) result= judge(ex) if SyntaxFlag: raise SyntaxError,'WTF are u "d"oin!!?' else: print(result) except EOFError: break if __name__ == '__main__': main()
Test Case:
1+1 123+321 100-50 100-123 123*3 8/2 100/3 (10+5)*2 (5-10)*3 (100/2)+(100/3)-(11*3) 2**3 (10**3)/1000 10**3/10**3 2**3**3 (2**3)**3 ( 2 ** 3) ** 3 1 + 3 3 ** 3 16%16 16%15 10*3==30 3**2+4**2 == 5**2 23421%3==43*2 2**3/4 == 10/5%2 10 == 10 != 5 10 != 5 == 5 10 != 10 == 10 HOGEHOGEWORLD
Response
>>2 >>444 >>50 >>-23 >>369 >>4.0 >>33.33 >>30 >>-15 >>50.33 >>8 >>1.0 >>1.0 >>134217728 >>512 >>512 >>4 >>27 >>0 >>1 >>True >>True >>False >>False >>True >>True >>False >>>>Traceback (most recent call last): File "ex3.py", line 141, in <module> main() File "ex3.py", line 134, in main raise SyntaxError,'WTF are u "d"oin!!?' SyntaxError: WTF are u "d"oin!!?
もし何かこれ期待するアンサーと違うぞ?っていうのがあれば教えて下さい。
そろそろ真剣にプログラミング言語作ったりするのもいいかなーって。
もちろん毎日セキュリティの勉強もしてるので、大丈夫です。。