[Haskell-cafe] Annotations in abstract syntax tree
j.romildo at gmail.com
j.romildo at gmail.com
Thu Apr 26 10:07:08 CEST 2012
Hello.
I need to annotate abstract syntax tree with additional information in a
compiler.
Using the Annotations package[1] I have written the following small
program:
import Annotations.F.Annotated
import Annotations.F.Fixpoints
data ExprF r
= Num Double
| Var String
| Add r r
| Sub r r
| Mul r r
| Div r r
deriving (Eq,Show)
type BareExpr = Fix ExprF
e :: BareExpr
e = In (Mul (In (Num 5))
(In (Add (In (Var "x"))
(In (Num 8)))))
type ValExpr = Fix (Ann Double ExprF)
type Memory = [(String,Double)]
eval :: Memory -> BareExpr -> ValExpr
eval _ (In (Num x)) = In (Ann x (Num x))
eval m (In (Var x)) = let y = case lookup x m of
Just k -> k
Nothing -> 0
in In (Ann y (Var x))
eval m (In (Add x y)) = op m (+) Add x y
eval m (In (Sub x y)) = op m (-) Sub x y
eval m (In (Mul x y)) = op m (*) Mul x y
eval m (In (Div x y)) = op m (/) Div x y
op m f k x y = let x'@(In (Ann v1 _)) = eval m x
y'@(In (Ann v2 _)) = eval m y
in In (Ann (f v1 v2) (k x' y'))
With these definitions we can represent simple arithmetic expressions
and we can also evaluate them, annotating each node in the abstract
syntax tree with its corresponding value.
Now I want to add statements to this toy language. One statement may be
a print statement containing an expression whose value is to be printed,
an assign statement containing an identifier and an expression, or a
compound statement containing two statements to be executed in sequence.
How the data types for statements can be defined?
How a function to execute an statement anotating its node with the
corresponding state (memory plus output) after its execution can be
defined?
Without annotations the type of statements could be:
data Stm
= PrintStm Expr
| AssignStm String Expr
| CompoundStm Stm Stm
How to enable annotations in this case? Note that Stm uses both Expr and Stm.
[1] http://hackage.haskell.org/package/Annotations
Romildo
More information about the Haskell-Cafe
mailing list