content: {-
  
     Parser.hs: Parser for the pleco interface definition language
  
     Part of Pleco: a trace definition DSL for Barrelfish
  
    Copyright (c) 2013, ETH Zurich.
  
    All rights reserved.
  
    This file is distributed under the terms in the attached LICENSE file.
    If you do not find this file, copies can be found by writing to:
    ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
  -}
  
  module Parser where
  
  import Text.ParserCombinators.Parsec as Parsec
  import Text.ParserCombinators.Parsec.Expr
  import Text.ParserCombinators.Parsec.Pos
  import qualified Text.ParserCombinators.Parsec.Token as P
  import Text.ParserCombinators.Parsec.Language( javaStyle )
  import Data.Char
  import Numeric
  import Data.List
  import Text.Printf
  
  parse filename = parseFromFile traceFile filename
  
  lexer = P.makeTokenParser (javaStyle
                             { P.reservedNames = [ "subsystem",
                                                   "event"
                                                 ]
                             , P.reservedOpNames = ["*","/","+","-"]
                             , P.commentStart = "/*"
                             , P.commentEnd = "*/"
                             , P.commentLine = "//"
                             })
  
  whiteSpace = P.whiteSpace lexer
  reserved   = P.reserved lexer
  identifier = P.identifier lexer
  stringLit  = P.stringLiteral lexer
  comma      = P.comma lexer
  commaSep   = P.commaSep lexer
  commaSep1  = P.commaSep1 lexer
  parens     = P.parens lexer
  braces     = P.braces lexer
  squares    = P.squares lexer
  semiSep    = P.semiSep lexer
  symbol     = P.symbol lexer
  
  data EventField = EventField String String
  data SubsystemClass = SubsystemClass String [ EventField ]
  
  traceFile =
      do
        whiteSpace
        subsystems <- many1 subsystemClass
        return subsystems
  
  
  subsystemClass =
      do
        reserved "subsystem"
        name <- identifier
        events <- braces $ many1 eventCase
        symbol ";" <?> " ';' missing from end of " ++ name ++ " subsystem definition"
        return $ SubsystemClass name events
  
  
  eventCase =
      do
        reserved "event"
        acronym <- identifier
        description <- stringLit
        symbol "," <?> " ',' missing from end of " ++ acronym ++ " definition"
        return $ EventField acronym description
  