# -*- tcl -*-
# Parsing Expression Grammar 'PEG'.
# Definition of a human-readable form of parsing expression grammar specification.

package require Tcl 8.5
package require snit
package require pt::peg::container

snit::type pt::peg::container::peg {
    constructor {} {
        install myg using pt::peg::container ${selfns}::G
        $myg start {n Grammar}
        $myg add   ALNUM ALPHA AND APOSTROPH ASCII Attribute Char CharOctalFull CharOctalPart CharSpecial CharUnescaped CharUnicode Class CLOSE CLOSEB COLON COMMENT DAPOSTROPH DDIGIT Definition DIGIT DOT END EOF EOL Expression Final Grammar GRAPH Header Ident Identifier IS LEAF Literal LOWER NOT OPEN OPENB PEG PLUS Prefix Primary PRINTABLE PUNCT QUESTION Range SEMICOLON Sequence SLASH SPACE STAR StartExpr Suffix TO UPPER VOID WHITESPACE WORDCHAR XDIGIT
        $myg modes {
            ALNUM         leaf
            ALPHA         leaf
            AND           leaf
            APOSTROPH     void
            ASCII         leaf
            Attribute     value
            Char          value
            CharOctalFull leaf
            CharOctalPart leaf
            CharSpecial   leaf
            CharUnescaped leaf
            CharUnicode   leaf
            Class         value
            CLOSE         void
            CLOSEB        void
            COLON         void
            COMMENT       void
            DAPOSTROPH    void
            DDIGIT        leaf
            Definition    value
            DIGIT         leaf
            DOT           leaf
            END           void
            EOF           void
            EOL           void
            Expression    value
            Final         void
            Grammar       value
            GRAPH         leaf
            Header        value
            Ident         leaf
            Identifier    value
            IS            void
            LEAF          leaf
            Literal       value
            LOWER         leaf
            NOT           leaf
            OPEN          void
            OPENB         void
            PEG           void
            PLUS          leaf
            Prefix        value
            Primary       value
            PRINTABLE     leaf
            PUNCT         leaf
            QUESTION      leaf
            Range         value
            SEMICOLON     void
            Sequence      value
            SLASH         void
            SPACE         leaf
            STAR          leaf
            StartExpr     value
            Suffix        value
            TO            void
            UPPER         leaf
            VOID          leaf
            WHITESPACE    void
            WORDCHAR      leaf
            XDIGIT        leaf
        }
        $myg rules {
            ALNUM         {x {t <} {t a} {t l} {t n} {t u} {t m} {t >} {n WHITESPACE}}
            ALPHA         {x {t <} {t a} {t l} {t p} {t h} {t a} {t >} {n WHITESPACE}}
            AND           {x {t &} {n WHITESPACE}}
            APOSTROPH     {t '}
            ASCII         {x {t <} {t a} {t s} {t c} {t i} {t i} {t >} {n WHITESPACE}}
            Attribute     {x {/ {n VOID} {n LEAF}} {n COLON}}
            Char          {/ {n CharSpecial} {n CharOctalFull} {n CharOctalPart} {n CharUnicode} {n CharUnescaped}}
            CharOctalFull {x {t \134} {.. 0 2} {.. 0 7} {.. 0 7}}
            CharOctalPart {x {t \134} {.. 0 7} {? {.. 0 7}}}
            CharSpecial   {x {t \134} {/ {t n} {t r} {t t} {t '} {t \42} {t \133} {t \135} {t \134}}}
            CharUnescaped {x {! {t \134}} dot}
            CharUnicode   {x {t \134} {t u} xdigit {? {x xdigit {? {x xdigit {? xdigit}}}}}}
            Class         {x {n OPENB} {* {x {! {n CLOSEB}} {n Range}}} {n CLOSEB} {n WHITESPACE}}
            CLOSE         {x {t \51} {n WHITESPACE}}
            CLOSEB        {t \135}
            COLON         {x {t :} {n WHITESPACE}}
            COMMENT       {x {t #} {* {x {! {n EOL}} dot}} {n EOL}}
            DAPOSTROPH    {t \42}
            DDIGIT        {x {t <} {t d} {t d} {t i} {t g} {t i} {t t} {t >} {n WHITESPACE}}
            Definition    {x {? {n Attribute}} {n Identifier} {n IS} {n Expression} {n SEMICOLON}}
            DIGIT         {x {t <} {t d} {t i} {t g} {t i} {t t} {t >} {n WHITESPACE}}
            DOT           {x {t .} {n WHITESPACE}}
            END           {x {t E} {t N} {t D} {n WHITESPACE}}
            EOF           {! dot}
            EOL           {/ {x {t \r} {t \n}} {t \n} {t \r}}
            Expression    {x {n Sequence} {* {x {n SLASH} {n Sequence}}}}
            Final         {x {n END} {n SEMICOLON} {n WHITESPACE}}
            Grammar       {x {n WHITESPACE} {n Header} {* {n Definition}} {n Final} {n EOF}}
            GRAPH         {x {t <} {t g} {t r} {t a} {t p} {t h} {t >} {n WHITESPACE}}
            Header        {x {n PEG} {n Identifier} {n StartExpr}}
            Ident         {x {/ {t _} {t :} alpha} {* {/ {t _} {t :} alnum}}}
            Identifier    {x {n Ident} {n WHITESPACE}}
            IS            {x {t <} {t -} {n WHITESPACE}}
            LEAF          {x {t l} {t e} {t a} {t f} {n WHITESPACE}}
            Literal       {/ {x {n APOSTROPH} {* {x {! {n APOSTROPH}} {n Char}}} {n APOSTROPH} {n WHITESPACE}} {x {n DAPOSTROPH} {* {x {! {n DAPOSTROPH}} {n Char}}} {n DAPOSTROPH} {n WHITESPACE}}}
            LOWER         {x {t <} {t l} {t o} {t w} {t e} {t r} {t >} {n WHITESPACE}}
            NOT           {x {t !} {n WHITESPACE}}
            OPEN          {x {t \50} {n WHITESPACE}}
            OPENB         {t \133}
            PEG           {x {t P} {t E} {t G} {n WHITESPACE}}
            PLUS          {x {t +} {n WHITESPACE}}
            Prefix        {x {? {/ {n AND} {n NOT}}} {n Suffix}}
            Primary       {/ {n ALNUM} {n ALPHA} {n ASCII} {n DDIGIT} {n DIGIT} {n GRAPH} {n LOWER} {n PRINTABLE} {n PUNCT} {n SPACE} {n UPPER} {n WORDCHAR} {n XDIGIT} {n Identifier} {x {n OPEN} {n Expression} {n CLOSE}} {n Literal} {n Class} {n DOT}}
            PRINTABLE     {x {t <} {t p} {t r} {t i} {t n} {t t} {t >} {n WHITESPACE}}
            PUNCT         {x {t <} {t p} {t u} {t n} {t c} {t t} {t >} {n WHITESPACE}}
            QUESTION      {x {t ?} {n WHITESPACE}}
            Range         {/ {x {n Char} {n TO} {n Char}} {n Char}}
            SEMICOLON     {x {t \73} {n WHITESPACE}}
            Sequence      {+ {n Prefix}}
            SLASH         {x {t /} {n WHITESPACE}}
            SPACE         {x {t <} {t s} {t p} {t a} {t c} {t e} {t >} {n WHITESPACE}}
            STAR          {x {t *} {n WHITESPACE}}
            StartExpr     {x {n OPEN} {n Expression} {n CLOSE}}
            Suffix        {x {n Primary} {? {/ {n QUESTION} {n STAR} {n PLUS}}}}
            TO            {t -}
            UPPER         {x {t <} {t u} {t p} {t p} {t e} {t r} {t >} {n WHITESPACE}}
            VOID          {x {t v} {t o} {t i} {t d} {n WHITESPACE}}
            WHITESPACE    {* {/ {t \40} {t \t} {n EOL} {n COMMENT}}}
            WORDCHAR      {x {t <} {t w} {t o} {t r} {t d} {t c} {t h} {t a} {t r} {t >} {n WHITESPACE}}
            XDIGIT        {x {t <} {t x} {t d} {t i} {t g} {t i} {t t} {t >} {n WHITESPACE}}
        }
        return
    }

    component myg
    delegate method * to myg
}

package provide pt::peg::container::peg 1
return
