module languages/generic-cpp/syntax/Conditionals[
  Identifier
  Condition
  Body
  Result
]

exports
  sorts IfPart ElifPart ElsePart

context-free syntax
  IfPart Body ElifPart[[Body]]* ElsePart[[Body]]? "#" "endif" -> Result
  
  "#" "if" Condition      -> IfPart
  "#" "ifdef" Identifier  -> IfPart
  "#" "ifndef" Identifier -> IfPart
  
  "#" "elif" Condition Body -> ElifPart[[Body]]
  "#" "else" Body            -> ElsePart[[Body]]

   "if" | "ifdef" | "ifndef" | "elif" | "else" | "endif" -> Identifier {reject}

lexical restrictions
  "if" -/- [d].[e].[f]
  "if" -/- [n].[d].[e].[f]