content: {-# LANGUAGE DeriveDataTypeable #-}
  
  module Text.Peggy.Syntax (
    Syntax,
    Definition(..),
    Expr(..),
    CharRange(..),
    CodeFragment,
    CodePart(..),
    Identifier,
    TermType,
    ) where
  
  import Data.Data
  
  type Syntax = [Definition]
  
  data Definition
    = Definition Identifier TermType Expr
    deriving (Show, Eq, Typeable, Data)
  
  data Expr
    = Terminals Bool Bool String
    | TerminalSet [CharRange]
    | TerminalCmp [CharRange]
    | TerminalAny
    | NonTerminal Identifier
    | Primitive Identifier
    | Empty
      
    | Named Identifier Expr
    
    | Sequence [Expr]
    | Choice   [Expr]
    | Many     Expr
    | Some     Expr
    | Optional Expr
    | And      Expr
    | Not      Expr
      
    | SepBy  Expr Expr
    | SepBy1 Expr Expr
    | Token  Expr
      
    | Semantic Expr CodeFragment
    deriving (Show, Eq, Typeable, Data)
  
  data CharRange
    = CharRange Char Char
    | CharOne Char
    deriving (Show, Eq, Typeable, Data)
  
  type CodeFragment = [CodePart]
  
  data CodePart
    = Snippet String
    | Argument Int
    | AntiArgument Int
    | ArgPos
    | ArgSpan
    deriving (Show, Eq, Typeable, Data)
  
  type Identifier = String
  type TermType = String
  