packages feed

SCRIPTWriter-1.0: lib/Bitcoin/Script/Parser/Parser.y

{
module Bitcoin.Script.Parser.Parser where

import Data.Bitcoin.Script.Types
import Bitcoin.Script.Parser.AST
}

%name buildAST
%tokentype { ScriptOp }
%error { parseError }

%token
  if    { OP_IF }
  ifn   { OP_NOTIF }
  else  { OP_ELSE }
  fi    { OP_ENDIF }
  ifdup { OP_IFDUP }
  op    { $$ }

%%

scriptAst : stmnts { $1 }

stmnts : if stmnts else stmnts fi stmnts { ScriptITE 0 $2 0 $4 0 $6 }
       | if stmnts fi stmnts { ScriptITE 0 $2 0 ScriptTail 0 $4 }
       | ifn stmnts else stmnts fi stmnts { ScriptITE 0 $4 0 $2 0 $6 }
       | ifn stmnts fi stmnts { ScriptITE 0 ScriptTail 0 $2 0 $4 }
       | ifdup stmnts { ScriptOp 0 OP_DUP $ ScriptITE 0 (ScriptOp 0 OP_DUP ScriptTail) 0
                                                        (ScriptOp 0 OP_DROP ScriptTail) 0
                                                        $2 }
       | op stmnts { ScriptOp 0 $1 $2 }
       | { ScriptTail }


{

parseError t = error $ "Parse error.. " ++ show t

}