@FrankBuss
i have written a pretty RPN evaluator for expressions, it's pretty able to handle variable, built-in functions (sin, cos, tan …), user-defined function (def my_f(…..))
lex("a=b a==b a!=b abc=/=bcd0 logicalNot ! shiftLeft >> notEqual end");
- token[0]: token=[a] TokenAlpha
- token[1]: token=[=] TokenAssign
- token[2]: token=[b] TokenAlpha
- token[3]: token=[a] TokenAlpha
- token[4]: token=[==] TokenEqual
- token[5]: token=[b] TokenAlpha
- token[6]: token=[a] TokenAlpha
- token[7]: token=[!=] TokenNotEqual
- token[8]: token=[b] TokenAlpha
- token[9]: token=[abc] TokenAlpha
- token[10]: token=[=/=] TokenNotEqual
- token[11]: token=[bcd0] TokenAlphaNum
- token[12]: token=[logicalNot] TokenUnaryNot
- token[13]: token=[!] TokenUnaryNot
- token[14]: token=[shiftLeft] TokenShiftLeft
- token[15]: token=[>>] TokenShiftRight
- token[16]: token=[notEqual] TokenNotEqual
- token[17]: token=[end] TokenRightBrace
RPN engine, expression validator
# calc "a=1+2+3*a*b*c"
output: a12+3a*b*c*+=
shunting_yard_analysis PASSED
stack_analysis PASSED
#########################
# good expression #
#########################
# calc "a++1"
output: a+1+
shunting_yard_analysis PASSED
stack_analysis FAILED
#########################
# bad expression #
#########################
# calc "a+((1+2)"
Error: parentheses mismatched
shunting_yard_analysis FAILED
stack_analysis FAILED
#########################
# bad expression #
#########################
i have a pretty tokenizer library, written to convert a script into a list of tokens, and i have already written an interpreter that look like pascal (see the Little project, it has conditional and loop statements, it does not have functions, yet)
my
Little project
example script
Program factorial
Begin
Input n
factorial = 1
While n > 1
Begin
factorial = factorial * n
n = n - 1
End
Output factorial
End
i have studied on the first edition of the
dragon book, but it misses the AST approach, i can't see any
Abstract Syntax Tree, while Yacc &C are using CST !