User-inputed code/math

BlitzMax Forums/BlitzMax Beginners Area/User-inputed code/math

Is there a way for the user to input "3*5+3.2/7" into an input or textfield and find the answer?

Your have to parse it yourself im afraid.

Either parsing/evaluating directly. or producing a parse tree, and evaluate that.

EDIT:
i was bored so i whipped up a simple expression evaluator as an example =)

EDIT2: beefed up version of this in code archives Expression Evaluator

Global source:String
Global pos:Int

Function ReportError( s:String)
	Print "ERROR: pos="+pos+" : "+s
EndFunction

Function EatWhitespace()
	While source[pos] = Asc(" ") 
		pos :+ 1
	Wend
EndFunction

Function EatNumber:Float()
	Local start:Int = pos
	Local gotsep:Int = False
	Local res:String	
	While (source[pos] >= Asc("0")) And (source[pos] <= Asc("9"))
		pos :+ 1
		If source[pos] = Asc(".") Then
			If gotsep Then ReportError( "error in float number")
			gotsep = True
			pos :+ 1
		EndIf
	Wend
	Return source[start..pos].ToFloat()
EndFunction

Function Primary:Float()
	Local lvalue:Float
	EatWhitespace()
	If source[pos] = Asc("(") Then
		pos :+ 1
		lvalue = AddExpression()
    		If source[pos] <> Asc(")") Then ReportError( "expected )")
    		pos :+ 1
	ElseIf (source[pos] >= Asc("0")) And (source[pos] <= Asc("9")) Then
		lvalue = EatNumber()
	ElseIf source[pos] = Asc("-") Then
		pos :+ 1
		lvalue = - Primary()
	Else
		ReportError( "expected number or -number or (expression)")
	EndIf
	EatWhitespace()
	Return lvalue
EndFunction

Function MulExpression:Float()
	Local lvalue:Float, rvalue:Float
	EatWhitespace()
	lvalue = Primary()
	While (source[pos] = Asc("*")) Or (source[pos] = Asc("/"))
		If source[pos] = Asc("*") Then
			pos :+ 1
			rvalue = Primary()
			lvalue = lvalue * rvalue
		ElseIf source[pos] = Asc("/") Then
			pos :+ 1
			rvalue = Primary()
			lvalue = lvalue / rvalue
		EndIf
	Wend
	EatWhitespace()
	Return lvalue
EndFunction
	
Function AddExpression:Float()
	Local lvalue:Float, rvalue:Float
	EatWhitespace()
	lvalue = MulExpression()
	While (source[pos] = Asc("+")) Or (source[pos] = Asc("-")) 
		If source[pos] = Asc("+") Then
			pos :+ 1
			rvalue = MulExpression()
			lvalue = lvalue + rvalue
		ElseIf source[pos] = Asc("-") Then
			pos :+ 1
			rvalue = MulExpression()
			lvalue = lvalue - rvalue		
		EndIf
	Wend
	EatWhitespace()
	Return lvalue
EndFunction

Function Expression:Float( s:String)
	Local result:Float
	source = s.Trim()
	pos = 0
	result = AddExpression()
	If pos < source.Length Then 
		ReportError( "invalid expression")
		Return 0
	EndIf
	Return result	
EndFunction

Print "3*5+3.2/7 = " + (3*5+3.2/7)
Print "expression= " + Expression( "3 * 5 + 3.2 / 7")


.

I added a beefed up version to the code archives for future reference.
Expression Evaluator