forked from ground/ground
108 lines
1.7 KiB
Plaintext
Executable File
108 lines
1.7 KiB
Plaintext
Executable File
#!/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
|