| -- | |
| -- 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)) |