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
 |