Finally I have a bit of free time to write down this post.

Some days ago a guy on the forum asked about how to ** evaluate at runtime simple mathematical expressions** with support for symbols and function calls.

Now that the *eval* function have been removed from the language for reasons I’ve not enought time to talk about, we need to parse and execute those expressions manually.

I built a simple Actionscript library that can be used to parse mathematical expressions: it has support for function calls, for variables and it is able to convert the expression into a postfix rappresentation if you may need it. The expression parser is quite simple and have been built manually following some concepts related to programming language compilers; it includes a Scanner (or lexer – however you want to call it) to tokenize the expression, a Parser that convert the expression into an Abstract Syntax Tree and a simple routine that evaluates that AST using a Symbol Table as evaluation context.

There are no comments inside the code right now; I hope to find a little bit of time to write an in depth discussion about this topic. In the mean time you can continue reading the entry for a general explanation about how does the code works and for some examples that may be useful.

Here is a simple example that shows how does the code works:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import it.sephiroth.expr.CompiledExpression; import it.sephiroth.expr.Parser; import it.sephiroth.expr.Scanner; public class Example { public static function run(): void { var expression: String = "sin( x / ( 8 / 2 + (-0.12 + 2.3) * x / x ) ) * 100"; var scanner: Scanner = new Scanner( expression ); var parser: Parser = new Parser( scanner ); var compiled: CompiledExpression = parser.parse(); var context: Object = { x: 100, sin: Math.sin, cos: Math.cos }; trace( 'Postfix:', compiled.toString() ); trace( 'Result:', compiled.execute( context ) ); } } |

Before I forgot, you can download the source code here with a simple example included.