{-# 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