Files
haskell-wasm/src/Language/Wasm/Parser.y
T
2018-01-20 10:43:57 -08:00

142 lines
3.1 KiB
Plaintext

{
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
module Language.Wasm.Parser (
) where
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TLEncoding
import Numeric.Natural
import Language.Wasm.Lexer (
Token (
TKeyword,
TIntLit,
TFloatLit,
TStringLit,
TId,
TOpenBracket,
TCloseBracket,
TReserved,
EOF
)
)
}
%name functype functype
%tokentype { Token }
%token
'(' { TOpenBracket }
')' { TCloseBracket }
'func' { TKeyword "func" }
'param' { TKeyword "param" }
'result' { TKeyword "result" }
'i32' { TKeyword "i32" }
'i64' { TKeyword "i64" }
'f32' { TKeyword "f32" }
'f64' { TKeyword "f64" }
'mut' { TKeyword "mut" }
'anyfunc' { TKeyword "anyfunc" }
id { TId $$ }
u32 { TIntLit (asUInt32 -> Just $$) }
%%
functype :: { FuncType }
: '(' 'func' paramtypes resulttypes ')' { FunctType $3 $4 }
paramtypes :: { [ParamType] }
: list(paramtype) { concat $1 }
paramtype :: { [ParamType] }
: '(' 'param' ident valtype ')' { [ParamType (Just $3) $4] }
| '(' 'param' list1(valtype) ')' { map (ParamType Nothing) $3 }
ident :: { Ident }
: id { Ident (TL.toStrict (TLEncoding.decodeUtf8 $1)) }
valtype :: { ValueType }
: 'i32' { I32 }
| 'i64' { I64 }
| 'f32' { F32 }
| 'f64' { F64 }
resulttypes :: { [ValueType] }
: list(resulttype) { concat $1 }
resulttype :: { [ValueType] }
: '(' 'result' list1(valtype) ')' { $3 }
limits :: { Limit }
: u32 u32 { Limit (fromIntegral $1) (Just $ fromIntegral $2) }
| u32 { Limit (fromIntegral $1) Nothing }
elemtype :: { ElemType }
: 'anyfunc' { AnyFunc }
tabletype :: { TableType }
: limits elemtype { TableType $1 $2 }
globaltype :: { GlobalType }
: valtype { Const $1 }
| '(' 'mut' valtype ')' { Mut $3 }
-- utils
rev_list(p)
: rev_list(p) p { $2 : $1 }
| {- empty -} { [] }
rev_list1(p)
: rev_list1(p) p { $2 : $1 }
| p { [$1] }
list(p)
: rev_list(p) { reverse $1 }
list1(p)
: rev_list1(p) { reverse $1 }
{
asUInt32 :: Integer -> Maybe Natural
asUInt32 val
| val >= 0, val < 2 ^ 32 = Just $ fromIntegral val
| otherwise = Nothing
data ValueType =
I32
| I64
| F32
| F64
deriving (Show, Eq)
data FuncType = FunctType {
params :: [ParamType],
results :: [ValueType]
} deriving (Show, Eq)
data ParamType = ParamType {
ident :: Maybe Ident,
paramType :: ValueType
} deriving (Show, Eq)
newtype Ident = Ident T.Text deriving (Show, Eq)
data GlobalType = Const ValueType | Mut ValueType deriving (Show, Eq)
data Limit = Limit Natural (Maybe Natural) deriving (Show, Eq)
data ElemType = AnyFunc deriving (Show, Eq)
data TableType = TableType Limit ElemType deriving (Show, Eq)
happyError tokens = error $ "Error occuried: " ++ show tokens
}