From 45ddc904afdd4ea383d1d13ad915e47010cc5c8c Mon Sep 17 00:00:00 2001 From: Sirin Puenggun Date: Thu, 1 Dec 2022 11:24:07 +0700 Subject: [PATCH] Add parsing the function and fix some var name --- .../__pycache__/fraction.cpython-310.pyc | Bin 2961 -> 5273 bytes nessesary/__pycache__/matrix.cpython-310.pyc | Bin 0 -> 4800 bytes .../parser/__pycache__/parser.cpython-310.pyc | Bin 0 -> 245 bytes .../__pycache__/structure.cpython-310.pyc | Bin 0 -> 1411 bytes nessesary/parser/parser.py | 49 +++++----- nessesary/parser/structure.py | 91 ------------------ nessesary/polynomial.py | 6 ++ 7 files changed, 33 insertions(+), 113 deletions(-) create mode 100644 nessesary/__pycache__/matrix.cpython-310.pyc create mode 100644 nessesary/parser/__pycache__/parser.cpython-310.pyc create mode 100644 nessesary/parser/__pycache__/structure.cpython-310.pyc delete mode 100644 nessesary/parser/structure.py create mode 100644 nessesary/polynomial.py diff --git a/nessesary/__pycache__/fraction.cpython-310.pyc b/nessesary/__pycache__/fraction.cpython-310.pyc index 54e7f9e0fc1521583386177f7797812d57a78d7a..34e85a69e2bf5daa872ff4a1b39b25bbed8032fe 100644 GIT binary patch literal 5273 zcmcgwPj4H?6`$E%k}HyuWlOf?q;o!0u1dvgngnKmD|K~fr1o6&nihzAsxCeB&})HyfPR1ldg{sN06pZ?-{zaYf$3*8ty#5-1WRiDTk2g4H(w3&QPI<%l0h1Y- zJ!LX`Vl+&d+hL`-=a|h(JTjlOjUff=$B{<$TsXZ+X*GI2jNq`87E{MxtYiE*6qo`y^s;PJ}|>YA6#ga*+)oSm>0o3)^XsmSGFTwjrhiMy4t0=DBtlro*y*5mK$ZX5~I0? zhx_jLmFla=^aB-H?T#lS6Pk?7uIoki=%k`Td`f~2p=3vygJyT&M%j3@QP375u-N@Y zl!2kRD#}RL>-T7iKj;RHVtlqj&ukQ$?Z8!W=Zq=19QNh<{qH{7aeGzK>i70l|A_$D zb6dfq$|KM9eb;ZQ!$-uQ46m|(7|o|Ff?Slp0g%6D^HpPkukxF`$ZfvB7x^+;qu!cs z?f1~mx|zM4%)uYV zm@IlW`9#9WIhn^=TNY#y-#Ixi7x2x?OL7t4g1juR;9HbSav9%wdDUHL8}gc5Ikg&> zb#)1wY0=h354Fj!euUR=0EAp}_^}1}!}!Y!?3jlJpfMa<4JXG8M-D?UonXe{;{ z)VfJvitL|Y+%E#yMjl5>zdTQEEdwMOy*Bt78nmU5@3CbvaJGkyQ5z73Osy4$WWYe6 zHxT%&(84|9N59uDlp@{tq)eh&9LQ*tf=-Wu&ggX45GRI?IlIKg;N2j57UT*HvT4t3XbuG0F+ilv0SF z0`~=_S;e_kDAD3aiz8uhBlML2O|h%f6#K_Sik-n@gcNw|M2D|Oz2#S{w_F`pulg2g z?c38;=MNqWu}ioTKuTpAHCtswaEdK**yW4%_bgG3uj!dmJL zxb& z)vaWcvkj~uM1U+)b`FF%B_q2-Mz%b5FB5c1brz;2PR~OJ)e@&_No{KXYpGS39(?gq ztV&b2%)mk%H%|=Y_pz70AxCYdw&E29cD_cpX_a=CJ4~AKTe6z}M665%{G|UBg+Q|F zWcy>`8zW&}zn3ZSv=>IRb&GZg0EL#~h#@+PVQ~;VKUHL0BtleFI zH({t#J4HseUCJnm8)}}wc_K!U2;p2OMen3h=}1l?Xutndh~HtBPw_s#N^zWilycih z#;4b)X6n>9wepybWK(7IK%pPgnzj*w6~bdp~}-qjE$DJ#uTb)&=nh< z?OGX$*x2mp`PPdx>XS5PY-G$9#`h859y+Ek`8v+@{MNjMv59k~`+?L*h`$4;&o;kk z@hj;BO;6Y^EmFbbHG8fQQC^5%UkOV^y=LBl6eY-V#~KF7T(dt+7ZZ4N5us;2GXX}}M zzE(9s+aiJpdIECHc8OpOVkPW;u}XXDg4U`z+2>4{qI8nn&51G?mm=elY}$Uy?W(WZ zYxaw%tNMOD(z-#%k&z~xuG<+BiKWKZHt#)cIGr2Zb~}gC-RA%Yj_s>2$x7Pbywz>_ zoHO-Je{xBKfFYGB*y7*`WKcB#7S;9Ct@RwLc>s$_9nS>>tTp4l0BQ-Zib|z6-lDr) z1h80~J<@v3cHqoMVUY@m#{kmI#_e<^;eh%>5U&mpGC^NL%`lN6ZxSH`Wbqx7rVmp* zrtfJ;L&B-pCJiDn7|LUw_}x}=(kT9b#P`NM&OZqa=Rv$IfWdUCs}II_YwAzoeyIKJ z%JpA3a+)mCrQ-!{e=cd1;=CyY=a)x67pinE9#k3foZ;sM&p5w{wq>=H`Mvr--%ilx z{K4pUwn{hu>6hW$mw_W%J2ieFl z@6zotU5A8ksq>(a1Nn{{s~ASS5TeOFh0f9#UDcPE~>Ti${jN=QQHCf;(k_0WNdU?5wxBA KaU3$oB!2*`gt%$| diff --git a/nessesary/__pycache__/matrix.cpython-310.pyc b/nessesary/__pycache__/matrix.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88f4b5a23b4b7df7c1f2e6f60f059b240e84b8a8 GIT binary patch literal 4800 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 literal 0 HcmV?d00001 diff --git a/nessesary/parser/__pycache__/parser.cpython-310.pyc b/nessesary/parser/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbb28a293ed8fb9ac51034c3f2e4f49b1b4e935f GIT binary patch literal 245 zcmd1j<>g`kf;~qXla+z=V-N=!FabFZKwQiNBvKes7+V;k7*d#m88n%b8G%AD0AhpG zIs-9SZ3#mSLo*{IP!CWoqn{?@E!Kjf%)Am!#weE5ih`n*3`HRIzcf;;VuDk14davZ za|?>{)8m0eR%&udOhIB%acU8i(krOE#SRk5%u5GZRSeS0!&t-uq=06FX|Q=n1T#?X R7Kcr4eoARhsvSZX0{|&fE~)?k literal 0 HcmV?d00001 diff --git a/nessesary/parser/__pycache__/structure.cpython-310.pyc b/nessesary/parser/__pycache__/structure.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..af13776177487da1a2725ca294c1ee7c851b40a9 GIT binary patch literal 1411 zcmZXT&2!sS5WuyvWXrOhq~C4&#eoCnBT%5FFr5yno3tKe*|qG@*}8a)S9O#4E0P@& zCYgbm9yxOcZv0Dog-iYgpLnZSns$)q{dV`a@4b1?mM5i>t*NK>@0zP5?-duc!jRuRl17T=o+rmI$j@Wbp0>D8!FyV@h07*TW>VH zMYnye{NAZLk#-6KIpt|aUR*(}E1Vw?|^^^pG;FVw?crDlw>53>aQB>@e&y>@f@(Mhs(y3B#0OpCM$37-kG}h69G5 z7!DbZ7=A9>40jklXZV8QONP4)_ZYrnxX$MAZqn4`WwMT}ioLW4E$&pk9xH zw}6ip@Cn0*3;1*aKQL@8;DZH}7w}>MFUzZ(?M*#cF4I^(YC09R&upBR9Jle*d9>N;x>di$nQgVo z^4hg!sj_kgjo@$^Vj&Eo`Eb@9?nE;-4|>CS@V6GC`dJru>6?xpjP7*%lhHJs47v)t zL4Vd62T>G6z3`|r?S)YgcA{B0@6YC8urWR2(jXWIVQ<)tn;**ya$mvFEwG^Y&R9!o z{atUxwGH|&h8}j*Vy}EV+*UDsE@%k86S#t!z!TI3zMv&|CTJ>P-hb9?b+_7H1ueho zEwf79UuG>QasFoI%-O1&$aw@HQv+B5* zaqCY|cfGJJNBv$P*Nwmbx9~zawjPWoG#>^J<$oAGR4^d^WR?+(BunC1|9`Y}%Pi{u E0s2E%sQ>@~ literal 0 HcmV?d00001 diff --git a/nessesary/parser/parser.py b/nessesary/parser/parser.py index fe8223b..da79169 100644 --- a/nessesary/parser/parser.py +++ b/nessesary/parser/parser.py @@ -19,13 +19,13 @@ def is_neg(expr, i) -> bool: i -= 1 return neg_sign%2 != 0 -def is_num(char: str): +def is_num(char: str) -> bool: """ Check if char agrument is number or not. """ return char in ['1','2','3','4','5','6','7','8','9','0'] -def is_op(char: str): +def is_op(char: str) -> bool: """ Check if char agrument is operator or not. """ @@ -33,25 +33,27 @@ def is_op(char: str): return True return False -def is_letter(char: str): +def is_letter(char: str) -> bool: """ Check if char agrument is string character or not. """ return "a" <= char <= "z" -def is_func(expr: str, i: int, result: str): +def is_func(expr: str, i: int, result: str) -> bool: """ Check if expression is a function or not. """ result = "" - for i in range(len(expr)): + while i < len(expr): if not is_letter(expr[i]): i -= 1 break result += expr[i] - return len(result) > 1 + i += 1 + new_index = i + return len(result) > 1, result, new_index -def priority(char: str): +def priority(char: str) -> int: """ set precedence for each operator. This program use PEMDAS RULE as main rule @@ -89,8 +91,8 @@ def make_postfix(expr: str): >>> make_postfix(" 3*4 + 2*5") 3 4 * 2 5 * + - >>> make_postfix("(2-3+4)*(5+6*7) - 2 3 - 4 5 6 7 * + ( * + ( + >>> make_postfix("(2-3+4)*(5+6*7)") + 2 3 - 4 + 5 6 7 * + * """ @@ -104,7 +106,8 @@ def make_postfix(expr: str): i = 0 while i < len(expr): char = expr[i] - if char == " ": + func_check, temp, last_index = is_func(expr, i, temp) + if char == " " or char == "," or char == ":": i += 1 continue @@ -119,31 +122,32 @@ def make_postfix(expr: str): elif char == ")": found = False while len(op_stack) != 0: - head = op_stack.pop() - if head == "(": + top = op_stack.pop() + if top == "(": found = True break else: - result += head + result += top result += " " i += 1 if not found: raise ValueError("Parentheses Error!") - elif is_op(char) or is_func(expr, i, temp): + elif is_op(char) or func_check: isfunc = len(temp) > 1 if (not isfunc) and (char == "-"): if i == 0 or is_op(expr[i-1]): neg = is_neg(expr, i) + i += 1 continue while len(op_stack) != 0: - head = op_stack[-1] - priority1 = (priority(head) < priority(char)) - priority2 = (priority(head) == priority(char)) - if char == "(" or head == "(" or priority1 or (priority2 and char == "^"): + top = op_stack[-1] + priority1 = (priority(top) < priority(char)) + priority2 = (priority(top) == priority(char)) + if char == "(" or top == "(" or priority1 or (priority2 and char == "^"): break - result += head + result += top op_stack.pop() result += " " @@ -151,6 +155,7 @@ def make_postfix(expr: str): op_stack.append(add_neg_sign(temp, neg)) neg = False temp = "" + i = last_index else: op_stack.append(char) i += 1 @@ -166,8 +171,8 @@ def make_postfix(expr: str): raise ValueError("Can't Parse this Letter!") while len(op_stack) != 0: - head = op_stack.pop() - result += head + top = op_stack.pop() + result += top result += " " i += 1 - return result[:len(result)-1] \ No newline at end of file + return result[:len(result)-1] diff --git a/nessesary/parser/structure.py b/nessesary/parser/structure.py deleted file mode 100644 index 8040514..0000000 --- a/nessesary/parser/structure.py +++ /dev/null @@ -1,91 +0,0 @@ -#VARIABLE AND NUMBER -VAR = 0 -NUM = 1 -POINT = 2 - -# OPERATOR -PLUS_S = 3 -MINUS_S = 4 -MUL_S = 5 -DIV_S = 6 -EXP_S = 7 - -# BRACKET AND PARENTHESES -LEFT_BRAC = 11 -RIGHT_BRAC = 12 -LEFT_PAR = 10 -RIGHT_PAR = 11 - -#FUNCTION -SQRT_FUNC = 100 -SIN_FUNC = 101 -COS_FUNC = 102 -TAN_FUNC = 103 -SEC_FUNC = 104 -COSEC_FUNC = 105 -COT_FUNC = 106 -ASIN_FUNC = 107 -ACOS_FUNC = 108 -ATAN_FUNC = 109 -ASEC_FUNC = 110 -ACOSEC_FUNC = 111 -ACOT_FUNC = 112 -FACTORIAL = 113 -LOG = 114 -LN = 115 - -ALPHABET_LIST = ['a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', - 'm', 'n', 'o', 'p', 'q', 'r', 's' - , 't', 'u', 'v', 'w', 'x', 'y', 'z'] - -NUM_LIST = ['1','2','3','4','5','6','7','8','9','0'] - -def general_parse(expr): - - result_list = [] - for value in expr: - if value == "+": - result_list.append(PLUS_S) - elif value == "-": - result_list.append(MINUS_S) - elif value == "*": - result_list.append(MUL_S) - elif value == "/": - result_list.append(DIV_S) - elif (value == "^") or (value == "*"): - result_list.append(EXP_S) - elif value == ".": - result_list.append(POINT) - - elif value == "(": - result_list.append(LEFT_PAR) - elif value == ")": - result_list.append(RIGHT_PAR) - elif value == "[": - result_list.append(LEFT_BRAC) - elif value == "]": - result_list.append(RIGHT_BRAC) - - elif value in ALPHABET_LIST: - result_list.append(VAR) - elif value in NUM_LIST: - result_list.append(NUM) - - """ - MEANING OF EACH PATTERN EXPRESSION. - RESULT_LIST MEANING - [1,1,1,...] 1231.. - [0,0,0] xyz - [1,1,2,1,1] 12.32 - [1,1,0] 15x - [10,11] () - [12,13] [] - [114,10,,11] log() - [115,10,,11] ln() - [1,1,113] 31! - [101,10,,11] sin() - [1,0,3,10,1,2,1, - 101,10,1,1,1,11,11] 5x+(4.2sin(324)) - """ - diff --git a/nessesary/polynomial.py b/nessesary/polynomial.py new file mode 100644 index 0000000..4860cc0 --- /dev/null +++ b/nessesary/polynomial.py @@ -0,0 +1,6 @@ +from parser.parser import polynomial_parse + +class Polynomial: + def __init__(self, poly): + self.coeff = polynomial_parse(poly) + self.degree = len(polynomial_parse(poly)) - 1 \ No newline at end of file