Haxe Code Cookbook
Haxe programming cookbookFunctional ProgrammingML-Style Parse Tree Evaluation

ML-Style Parse Tree Evaluation

Reading time: 1 minute

ML-like languages are great for creating interpreters or compilers, by virtue of Algebraic Data Types. Haxe's enum allow for writing similarly elegant code.

Below is the Haxe version of F# code for a simple expression interpreter, described in Programming Language Concepts (Sestoft).

Implementation

The eval function uses pattern matching against an expression, represented by a parametized enum data data type.

 class Main {  /**   The eval function uses pattern matching against an expression,   represented by a parametized enum data data type.   **/  static public function eval(e:Expr):Int {  return switch e {  case CstI(x): x;  case Prim("+", e1, e2): eval(e1) + eval(e2) ;  case Prim("-", e1, e2): eval(e1) - eval(e2) ;  case Prim("*", e1, e2): eval(e1) * eval(e2) ;  case Prim(_) : throw "Unknown primitive";  }  }    // Some simple tests.  static public function main():Void {  // Evaluate the expression 23.  trace( eval( CstI(23) ) );  // Evaluate the expression (7 * 9) + 10.  trace( eval( Prim("+", Prim("*", CstI(7), CstI(9)), CstI(10)) ) );  } } /* Algabreic Data Type for an arithmetic expression. In F# would be:  type expr =   | CstI of int  | Prim of string * exp * exp  */ enum Expr {  CstI( x:Int ); // An integer constant  Prim( op:String, e1:Expr, e2:Expr ); // Or a primary arithmetic expression } 

Contributors:
Jens Fischer
Mark Knol
yc
Last modified:
Created: