Hsed-0.1: Ast.hs
-- |
-- Module : Ast
-- Copyright : (c) Vitaliy Rkavishnikov
-- License : BSD-style (see the file LICENSE)
--
-- Maintainer : virukav@gmail.com
-- Stability : experimental
-- Portability : non-portable
--
-- The main types used in the program
module Ast where
import SedRegex (Pattern)
import Data.ByteString.Char8 (ByteString)
-- | Editing commands
data SedCmd = SedCmd Address SedFun deriving Show
-- | Functions represents a single-character command verb
data SedFun =
Group [SedCmd] -- ^ { - group of the sed commands
| LineNum -- ^ = - write to standard output the current line number
| Append Text -- ^ a - append text following each line matched by address
| Branch (Maybe Label) -- ^ b - transfer control to Label
| Change Text -- ^ c - replace the lines selected by the address with Text
| Delete -- ^ d - delete line(s) from pattern space
| DeletePat -- ^ D - delete (up to newline) of multiline pattern space
| ReplacePat -- ^ g - copy hold space into the pattern space
| AppendPat -- ^ G - add newline followed by hold space into the pattern space
| ReplaceHold -- ^ h - copy pattern space into hold space
| AppendHold -- ^ H - add newline followed by pattern space into the hold space
| Insert Text -- ^ i - insert Text before each line matched by address
| List -- ^ l - list the pattern space, showing non-printing chars in ASCII
| Next -- ^ n - read next line of input into pattern space
| AppendLinePat -- ^ N - add next input line and newline into pattern space
| PrintPat -- ^ p - print the addressed line(s)
| WriteUpPat -- ^ P - print (up to newline) of multiline pattern space
| Quit -- ^ q - quit when address is encounterd
| ReadFile FilePath -- ^ r - add contents of file to the pattern space
| Substitute Pattern Replacement Flags -- ^ s - substitute Replacement for Pattern
| Test (Maybe Label) -- ^ t - branch to line marked by :label if substitution was made
| WriteFile FilePath -- ^ w - write the line to file if a replacement was done
| Exchange -- ^ x - exchange pattern space with hold space
| Transform Text Text -- ^ y - transform each char by position in Text to Text
| Label Label -- ^ : - label a line in the scipt for transfering by b or t.
| Comment -- ^ # - ignore a line in the script except "#n" in the first line
| EmptyCmd -- ^ - ignore spaces
deriving Show
-- | The work buffer to keep the selected line(s)
--data PatternSpace = PatternSpace [ByteString] deriving Show
-- | The work buffer to keep the line(s) temporarily
--data HoldSpace = HoldSpace [ByteString] deriving Show
-- | An address is either a decimal number that counts input lines cumulatively across files,
-- a '$' character that addresses the last line of input, or a context address as BRE
data Addr = LineNumber Int
| LastLine
| Pat Pattern
deriving Show
-- | A permissable address is representing by zero, one or two addresses
data Address = Address (Maybe Addr) (Maybe Addr) Invert
deriving Show
-- | Used in the replacement string. An appersand ('&') will be replaced by the
-- string matched the BRE. The characters "\n", where n is a digit will be
-- replaced by the corresponding back-reference expression.
data Occurrence = Replace Int | ReplaceAll
deriving Show
-- | The flag to control the pattern space output in the substitute function
type OutputPat = Bool
-- | The allowed sequence of the Occurrence and OutputPat flags in the substitute
-- function
data OccurrencePrint = OccurrencePrint (Maybe Occurrence) OutputPat |
PrintOccurrence OutputPat (Maybe Occurrence)
deriving Show
-- | Flags used in the substitute command
data Flags = Flags (Maybe OccurrencePrint) (Maybe FilePath)
deriving Show
type Replacement = ByteString
type Invert = Bool
type Text = ByteString
type Label = ByteString