module Language.Modelica.Parser.ComponentClause where


import Language.Modelica.Syntax.Modelica

import Language.Modelica.Parser.Parser (Parser)
import Language.Modelica.Parser.Expression
import Language.Modelica.Parser.Modification
import Language.Modelica.Parser.Lexer
import Language.Modelica.Parser.Basic


import Control.Applicative
  (liftA, liftA2, liftA3, (*>), (<$>), (<*>))

import Text.ParserCombinators.Parsec (optionMaybe)



component_clause :: Parser ComponentClause
component_clause = ComponentClause <$>
  type_prefix <*>
  type_specifier <*>
  (optionMaybe array_subscripts) <*>
  component_list


component_list :: Parser ComponentList
component_list = liftA2 ComponentList
  component_declaration (commaList component_declaration)

component_declaration :: Parser ComponentDeclaration
component_declaration = liftA3 ComponentDeclaration
  declaration (optionMaybe condition_attribute) comment

condition_attribute :: Parser ConditionAttribute
condition_attribute =
  liftA ConditionAttribute $ if_ *> expression