2017-11-27 21:45:37 +03:00
|
|
|
{-# LANGUAGE DataKinds #-}
|
|
|
|
module Data.AST where
|
|
|
|
|
|
|
|
import Data.Range
|
|
|
|
import Data.Record
|
|
|
|
import Data.Span
|
|
|
|
import Data.Term
|
2018-05-01 19:51:34 +03:00
|
|
|
import Data.Aeson
|
2018-06-04 17:59:31 +03:00
|
|
|
import Data.Text (pack)
|
2018-05-01 19:51:34 +03:00
|
|
|
import Data.JSON.Fields
|
|
|
|
|
2017-11-27 21:45:37 +03:00
|
|
|
-- | An AST node labelled with symbols and source location.
|
|
|
|
type AST syntax grammar = Term syntax (Node grammar)
|
|
|
|
|
|
|
|
data Node grammar = Node
|
2018-06-04 17:59:31 +03:00
|
|
|
{ nodeSymbol :: !grammar
|
2017-11-27 21:45:37 +03:00
|
|
|
, nodeByteRange :: {-# UNPACK #-} !Range
|
2018-06-04 17:59:31 +03:00
|
|
|
, nodeSpan :: {-# UNPACK #-} !Span
|
2017-11-27 21:45:37 +03:00
|
|
|
}
|
2018-06-28 20:20:44 +03:00
|
|
|
deriving (Eq, Ord, Show)
|
2017-11-27 21:45:37 +03:00
|
|
|
|
2018-05-01 19:51:34 +03:00
|
|
|
|
|
|
|
instance Show grammar => ToJSONFields (Node grammar) where
|
|
|
|
toJSONFields Node{..} =
|
2018-06-04 17:59:31 +03:00
|
|
|
[ "symbol" .= pack (show nodeSymbol)
|
|
|
|
, "span" .= nodeSpan
|
|
|
|
]
|
2018-05-01 19:51:34 +03:00
|
|
|
|
2017-11-27 21:45:37 +03:00
|
|
|
-- | A location specified as possibly-empty intervals of bytes and line/column positions.
|
|
|
|
type Location = '[Range, Span]
|
|
|
|
|
|
|
|
nodeLocation :: Node grammar -> Record Location
|
|
|
|
nodeLocation Node{..} = nodeByteRange :. nodeSpan :. Nil
|