Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // https://ratfactor.com/forth/the_programming_language_that_writes_itself.html
- // https://rosettacode.org/wiki/Parsing/RPN_calculator_algorithm
- var stack = []
- var depth = 0
- fn stackPush(v) {
- if (depth >= 256) {
- printConsoleShowWindow()
- printConsoleClear()
- printConsole("Error: stack depth overflow.")
- }
- stack[depth] = v
- depth += 1
- }
- fn stackPop() {
- if (depth <= 0) {
- printConsoleShowWindow()
- printConsoleClear()
- printConsole("Error: stack depth underflow.")
- }
- depth -= 1
- return stack[depth]
- }
- fn printStack() {
- printConsole("[")
- for (var i = 0; i < depth; i += 1) {
- printConsole(numberToString(stack[i]))
- if (i != (depth-1)) {
- printConsole(", ")
- }
- }
- printConsole("]")
- }
- fn logOperatorToken(t) {
- printConsole("Token | Action | Stack: ")
- printConsole(t)
- printConsole(" | ")
- printConsole("Apply operator to top of stack")
- printConsole(" | ")
- printStack()
- printConsole("\n")
- }
- fn logNumberToken(t) {
- printConsole("Token | Action | Stack: ")
- printConsole(t)
- printConsole(" | ")
- printConsole("Push number onto top of stack")
- printConsole(" | ")
- printStack()
- printConsole("\n")
- }
- // RPN init
- for (var i = 0; i < 256; i += 1) {
- append(stack, 0.0)
- }
- let s = " 3 4 2 * 1 5 - 2 3 ^ ^ / + "
- // RPN
- var buffer = ""
- for (var i = 0; i < len(s); i += 1) {
- let c = s[i]
- if (c == ' ') {
- let t = buffer
- buffer = ""
- if (t == "") {
- continue
- }
- if (t == "+" || t == "-" || t == "*" || t == "/" || t == "^") {
- let secondOperand = stackPop()
- let firstOperand = stackPop()
- if (t == "+") {
- stackPush(firstOperand + secondOperand)
- }
- if (t == "-") {
- stackPush(firstOperand - secondOperand)
- }
- if (t == "*") {
- stackPush(firstOperand * secondOperand)
- }
- if (t == "/") {
- stackPush(firstOperand / secondOperand)
- }
- if (t == "^") {
- stackPush(pow(firstOperand, secondOperand))
- }
- logOperatorToken(t)
- } else {
- let n = interpretStringToInteger(t)
- stackPush(n)
- logNumberToken(t)
- }
- } else {
- buffer += c
- }
- }
- printConsole("Stack depth: " + numberToString(depth) + "\n")
- printConsole("Stack value: " + numberToString(stack[0]) + "\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement