forked from ground/ground
108 lines
1.7 KiB
Plaintext
108 lines
1.7 KiB
Plaintext
|
#!/usr/bin/env ground
|
||
|
|
||
|
@begin
|
||
|
stdout "Calculation: "
|
||
|
stdin &calc
|
||
|
getstrsize $calc &calcsize
|
||
|
set &counter 0
|
||
|
set &left ""
|
||
|
set &right ""
|
||
|
set &operator ' '
|
||
|
set &isRight false
|
||
|
|
||
|
## Preprocessing
|
||
|
|
||
|
# Loop to parse input
|
||
|
@loopstart
|
||
|
getstrcharat $calc $counter &char
|
||
|
|
||
|
# Remove any spaces (they're inconvenient)
|
||
|
equal $char ' ' &cond
|
||
|
if $cond %doneif
|
||
|
|
||
|
# Check for operators
|
||
|
# '+' operator
|
||
|
inequal '+' $char &cond
|
||
|
if $cond %minusOpCheck
|
||
|
set &operator $char
|
||
|
set &isRight true
|
||
|
jump %doneif
|
||
|
|
||
|
@minusOpCheck
|
||
|
# '-' operator
|
||
|
inequal '-' $char &cond
|
||
|
if $cond %multiplyOpCheck
|
||
|
set &operator $char
|
||
|
set &isRight true
|
||
|
jump %doneif
|
||
|
|
||
|
@multiplyOpCheck
|
||
|
# '*' operator
|
||
|
inequal '*' $char &cond
|
||
|
if $cond %divideOpCheck
|
||
|
set &operator $char
|
||
|
set &isRight true
|
||
|
jump %doneif
|
||
|
|
||
|
@divideOpCheck
|
||
|
# '/' operator
|
||
|
inequal '/' $char &cond
|
||
|
if $cond %endOpChecks
|
||
|
set &operator $char
|
||
|
set &isRight true
|
||
|
jump %doneif
|
||
|
|
||
|
@endOpChecks
|
||
|
if $isRight %isRight
|
||
|
add $left $char &left
|
||
|
jump %doneif
|
||
|
@isRight
|
||
|
add $right $char &right
|
||
|
@doneif
|
||
|
add 1 $counter &counter
|
||
|
inequal $counter $calcsize &cond
|
||
|
if $cond %loopstart
|
||
|
# End loop
|
||
|
|
||
|
## Computing
|
||
|
|
||
|
# Convert types
|
||
|
stod $left &left
|
||
|
stod $right &right
|
||
|
|
||
|
# Calculations
|
||
|
# Adding
|
||
|
inequal $operator '+' &cond
|
||
|
if $cond %subtract
|
||
|
add $left $right &result
|
||
|
stdlnout $result
|
||
|
jump %begin
|
||
|
|
||
|
# Subtracting
|
||
|
@subtract
|
||
|
inequal $operator '-' &cond
|
||
|
if $cond %multiply
|
||
|
subtract $left $right &result
|
||
|
stdlnout $result
|
||
|
jump %begin
|
||
|
|
||
|
# Multiplying
|
||
|
@multiply
|
||
|
inequal $operator '*' &cond
|
||
|
if $cond %divide
|
||
|
multiply $left $right &result
|
||
|
stdlnout $result
|
||
|
jump %begin
|
||
|
|
||
|
# Dividing
|
||
|
@divide
|
||
|
inequal $operator '/' &cond
|
||
|
if $cond %error
|
||
|
divide $left $right &result
|
||
|
stdlnout $result
|
||
|
jump %begin
|
||
|
|
||
|
@error
|
||
|
stdlnout "Uh oh something terribly terrible happened lmao"
|
||
|
jump %begin
|