Last updated:
0 purchases
postfixcalcadvanced 0.1
EZmachining
String Expression Calculation
The project can translate infix expressions to postfix(str to tuple with members of different types).
And can calculate if needed.
Used algorithm from Алгоритм сортировочной станции ,
also known as Shunting yard algorithm. I used less detailed russian wiki and had no choice but improove it a little - degree('^') handler added. Unary minus was created too - better fix negatives in postfixing than in calculating.
You can see project here https://github.com/wolkolak/postfixcalc
Initially I tried to find suitable module on PYPI but failed unfortunately:
Firstly expression can contain functions: sin, pow, mod, neg, etc. Most projects can't work with that.
Just why? There is no way for real expressions to not contain any functions. You need sin and cos at least.
Is trigonometry only for sinners? I don't think so.
Secondly module should handle logic operators too: '<' , '==' , 'AND' ,
'OR' , etc. And variables, too.
The third point - i need to create postfix expressions tens of times, and calculate it thousands of times.
Because of that postfix expressions had to be turned into tuples. Entire module is a part of my CNC interpreter.
Fourth point - I don't want to see "divided by zero error", so calculator should return None in that case.
To calculate infix expression You need next functions:
tokenize
a = tokenize('-2^ -(sin(5)3)')
print(a)
->>['-', 2.0, '^', '(', '-', '(', 'sin', '(', 5.0, ')', '', 3.0, ')', ')']'
tokensPostfixing
b = tokensPostfixing(a)
print(b)
-->(2.0, 5.0, 'sin', 3.0, '*', '', '^', '')'
postfixTokenCalc
print(postfixTokenCalc(b, DICT_VARS=None))
-0.8342390624578879
dict_A = {'x': 5}
print(postfixTokenCalc(('x', 1.0, '+', 6, '=='), DICT_VARS=dict_A))
True
print('complex?: ', postfixTokenCalc((5, 3j, '-',)))
complex?: (5-3j)
As you can see, even complex numeric type didn't break the program. For now. I do not require complex in CNC, so I run only one test with it.
And '=' is not a mathematical or logical operator - your expression for calculation should not contain assignments in the middle(You can start from "=" though). Best time to handle assignments would be after tokenization, I believe.
If You need different operators and functions (or sin in radians for example), look at the followed dicts and modify:
OPERATORs_DICT_math: +, -, /, *, ^
OPERATORs_DICT_logic_L AND, NOT, OR', GT...
OPERATORs_DICT_func_1 sqrt, pow1', abc, neg, mod, sin ... # functions with 1 arg
OPERATORs_DICT_func_2 pow2 # functions with 2 args
OPERATORs_DICT_compare1 <, =, > (= should only be used as a part of '<=', '>=', '==' as explained above)
OPERATORs_DICT_compare2 <=, ==, <>, >=
OPERATORs_PRECEDENCE_DICT functions and operators precedence, obviously
Also, You can use DICT_VARS to look for your variables. You can throw away some operators like 'GT' or 'EQ' - this is the same as '>' and '==' in some CNC and other languages, and not required for You, probably.
PS: This is my first attempt to share code with others, tell me if something wrong.
For personal and professional use. You cannot resell or redistribute these repositories in their original state.
There are no reviews.