Skip to main content

Tokeniztion, posfixing and postfix calculation

Project description

EZmachining

image

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:

  1. tokenize
    a = tokenize('-2^ -(sin(5)3)')
    print(a)
    ->>['-', 2.0, '^', '(', '-', '(', 'sin', '(', 5.0, ')', '
    ', 3.0, ')', ')']'

  2. tokensPostfixing
    b = tokensPostfixing(a)
    print(b)
    -->(2.0, 5.0, 'sin', 3.0, '*', '', '^', '')'

  3. 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.

Project details


Release history Release notifications | RSS feed

This version

0.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

postfixcalc_advanced-0.1.tar.gz (8.9 kB view hashes)

Uploaded Source

Built Distribution

postfixcalc_advanced-0.1-py3-none-any.whl (13.4 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page