content: {-# LANGUAGE DeriveAnyClass, DeriveGeneric, TypeFamilies, QuasiQuotes
      , DataKinds, ScopedTypeVariables, OverloadedStrings, TypeSynonymInstances
      , FlexibleInstances, UndecidableInstances, FlexibleContexts, TemplateHaskell
      , DeriveDataTypeable #-}
  module Star1Grammar where
  import Language.ANTLR4
  
  data MyMaybe x = Nope | Yep x
    deriving (Eq, Ord, Show)
  
  data Mem = Byte
    deriving (Eq, Ord, Show)
  
  data Words =
      Frst (MyMaybe (String, String)) [String] [Mem]
    | Snd
    | Thrd (MyMaybe (String, String))
    deriving (Eq, Ord, Show)
  
  [g4|
    grammar Star1;
  
    words   : me 'you' page* '{' bytes '}'  -> Frst
            | me                            -> Thrd
            | 'woops'                       -> Snd
            ;
  
    bytes : 'byte'            -> ${ [Byte] }
          | bytes ',' 'byte'  -> ${\bs -> Byte : bs}
          ;
  
    me  : me2? -> ${\m -> case m of Nothing -> Nope ; Just x -> Yep x};
    me2 : me3 ;
    me3 : Me page ;
    Me  : 'me' -> String ;
  
    page    : Page ;
    Page : 'page' -> String ;
  
    WS      : [ \t\n\r\f\v]+     -> String;
  |]
  
  