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:

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.

Continue reading →