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