blob: ab6ec0f70bd33cce4f39b73ed778c42b3b74c24b [file] [log] [blame] [edit]
--
-- Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
--
-- SPDX-License-Identifier: BSD-2-Clause
--
{-# OPTIONS_GHC -fno-warn-unused-do-bind #-}
module CapDL.Parser where
import Prelude ()
import Prelude.Compat
import CapDL.AST
import CapDL.ParserUtils
import Text.ParserCombinators.Parsec
obj_decl_or_ref :: MapParser (Either KODecl NameRef)
obj_decl_or_ref =
(try $ do
d <- obj_decl
comma <|> return ""
return $ Left d)
<|> (do n <- name_ref
comma <|> return ""
return $ Right n)
opt_obj_decls :: MapParser [Either KODecl NameRef]
opt_obj_decls = braces (many obj_decl_or_ref) <|> return []
object :: MapParser KO
object = do
typ <- object_type
params <- object_params
decls <- opt_obj_decls
return (Obj typ params decls)
obj_decl :: MapParser KODecl
obj_decl = do
qname <- qname
symbol "="
obj <- CapDL.Parser.object
return (KODecl qname obj)
obj_decls :: MapParser [Decl]
obj_decls = do
reserved "objects"
decls <- braces $ many obj_decl
return $ map ObjDecl decls
cap_mapping :: Maybe Word -> Maybe NameRef -> MapParser CapMapping
cap_mapping sl nm = do
obj <- name_ref
params <- cap_params
parent <- maybe_parent
return $ CapMapping sl nm obj params parent
cap_name_ref :: Maybe Word -> Maybe NameRef -> MapParser CapMapping
cap_name_ref sl nm = do
symbol "<"
name <- name_ref
symbol ">"
params <- cap_params
parent <- maybe_parent
return $ CopyOf sl nm name params parent
maybe_name :: MapParser (Maybe NameRef)
maybe_name =
optionMaybe $ try $ do
n <- name_ref
symbol "="
return n
cap_mapping_or_ref :: MapParser CapMapping
cap_mapping_or_ref = do
sl <- maybe_slot
nm <- maybe_name
cap_mapping sl nm <|> cap_name_ref sl nm
cap_decl :: MapParser Decl
cap_decl = do
n <- name_ref
ms <- braces (sepEndBy cap_mapping_or_ref opt_semi)
return $ CapDecl n ms
cap_name_decl :: MapParser Decl
cap_name_decl = do
n <- name
symbol "="
symbol "("
ref <- name_ref
symbol ","
slot <- parse_slot
symbol ")"
return $ CapNameDecl n ref slot
cap_decls :: MapParser [Decl]
cap_decls = do
reserved "caps"
braces $ many (try cap_name_decl <|> try cap_decl)
decl_section :: MapParser [Decl]
decl_section =
obj_decls <|> cap_decls <|> irq_decls <|> cdt_decls
capDLModule :: MapParser Module
capDLModule = do
whiteSpace
arch <- parse_arch
decls <- many1 decl_section
eof
return (Module arch (concat decls))