source: proto/RE/input/grammar/re.scatter @ 3076

Last change on this file since 3076 was 3076, checked in by ksherdy, 6 years ago

Updated grammar to handle '$'. Added lower bound / upper bound attributes.

File size: 3.6 KB
RevLine 
[3069]1// Author: Tom Shermer, Ken Herdy
2//
3// Regular Expression CFG
4//
5// Supports context dependent lexical analysis.
6//
7// Modified:    31-09-2012      Original definition.
8// Modified:    04-25-2013              Character-by-character, any character, sos, eos, bounded repetition.
9//                                                              Context for bounded repetition.
[3076]10//
11// Todo: Verify BackSlash.
[2346]12
[3069]13types {}
14
[2346]15context main {
16        recognizers {
17                Whitespace [IGNORE],
[3076]18                Escape[CHARACTER_ESCAPE]                "\\" "[.]" 1 1,
19                Escape[HEXADECIMAL_ESCAPE]              "\\x" "0123456789abcdefABCDEF" 2 2 16,
20                Escape[UNICODE_ESCAPE]                  "\\u" "0123456789abcdefABCDEF" 4 4 16,
[3074]21                Punctuator,
[3069]22                Comment [IGNORE] "(?#" ")",
[3076]23                EndOfInput,                                             // must precede CHARACTER
24                Character [CHARACTER],                  // non-punctuators     
[2346]25        }
26
[3069]27        tokens { 
[3076]28                LEFTROUND       "(",   
29                RIGHTROUND      ")",
[3074]30                LEFTSQUARE      "[",     
[3076]31                LEFTCURLY       "{",     
[2346]32
[3069]33                OR                      "|",
34                OPTIONAL        "?",
35                STAR            "*",
36                PLUS            "+",
37               
38                ANY             ".",
[3076]39                SOS             "^",   
40                EOS                     "$",   
41        //      BACKSLASH       "\\",
[2346]42        }
43}
[3069]44
45context charClass {     
[2346]46        recognizers {
47                Whitespace [IGNORE],
[3076]48                Escape[CHARACTER_ESCAPE]                "\\" "[.]" 1 1,
49                Escape[HEXADECIMAL_ESCAPE]              "\\x" "0123456789abcdefABCDEF" 2 2 16,
50                Escape[UNICODE_ESCAPE]                  "\\u" "0123456789abcdefABCDEF" 4 4 16,
[2346]51                Punctuator,
[3076]52                EndOfInput,                                             // must precede CHARACTER
53                Character [CHARACTER],                  // non-punctuators
54               
[2346]55        }       
[3069]56        tokens {
[2346]57                RIGHTSQUARE "]",
[3069]58                NOT             "^",
59                THROUGH         "-",
[3076]60        //      BACKSLASH       "\\",
[3069]61        }
62}
[2346]63
[3069]64context boundedRepetition {
65        recognizers {
66                Whitespace [IGNORE],
[3074]67                Punctuator,
[3069]68                Integer [INTEGER_CONST],
69                EndOfInput,
70        }       
71        tokens {
72                RIGHTCURLY "}",
73                COMMA           ",",
[2346]74        }
75}
76
[3076]77interfaces {
[3069]78        complementable {boolean isComplemented = false;},
[3076]79        repeatable{boolean isRepeated = true;},
[3074]80        intValued {int value = 0;},
[3076]81        intRange{int lowerBound = 0; int upperBound = 0;},
[2346]82}
83
84nodes {
85        characterClass {complementable;} [],
[3069]86        lowerBound{intValued;} [],
87        upperBound{intValued;} [],
[3076]88        repetitionIndicator{intRange;} [],
[3069]89        boundedRepetitionIndicator{repeatable;} [],
[2346]90}
91//
92// to change scanning contexts, use the ◊ operator (in ascii: <> ).
93// ◊(contextName) pushes the context on a stack, ◊ with nothing
94// following it pops the current context from the stack.
95// ◊ works only when applied to a terminal; do not apply to a nonterminal.
96// see the production for characterClass below, where everything from
97// "◊(charClass)" to "◊" is done in the "charClass" scanning context.
98// Note that this means that RIGHTSQUARE must be recognized in the
99// "charClass" context.
100grammar {
[3069]101        start                   â†’ re ;
102        re                              ʉ → alternation ;
103        alternation     Ê‰ → concatenation (OR↑ concatenation)* ;   
104        concatenation   Ê‰ → repetition+ ;                                           
105        repetition              ʉ → atom (repetitionIndicator | boundedRepetitionIndicator)?; // ↑↑!? ;
[2346]106       
[3076]107        repetitionIndicator →         OPTIONAL {@lowerBound = 0; @upperBound = 1;} |
108                                                        STAR {@lowerBound = 0; @upperBound = -1;} |
109                                                        PLUS {@lowerBound = 1; @upperBound = -1;};
[3069]110                                                       
[3076]111        boundedRepetitionIndicator      → LEFTCURLY◊(boundedRepetition) (lowerBound)? (COMMA {@isRepeated=false;} (upperBound)? )? RIGHTCURLY◊ ;
112        lowerBound              → INTEGER_CONST {@value = @@value;} ;
113        upperBound              → INTEGER_CONST {@value = @@value;} ;                                         
[2346]114       
[3069]115        atom                    ʉ → LEFTROUND re RIGHTROUND | char | characterClass | any | sos | eos ;
116       
[3076]117        char                    → CHARACTER | CHARACTER_ESCAPE | HEXADECIMAL_ESCAPE | UNICODE_ESCAPE ;
[3069]118               
119        characterClass  →     LEFTSQUARE◊(charClass)
120                                                        (NOT {@isComplemented = true;})?
121                                                        range*
122                                                RIGHTSQUARE◊ ;
[2346]123                                         
[3076]124        range                   Ê‰ → char (THROUGH↑ char)? ;
[3069]125
126        any                             â†’ ANY ;
127        sos                             â†’ SOS ;
[3076]128        eos                             â†’ EOS ;
129       
130        // backslash            → BACKSLASH ;
[2346]131}
Note: See TracBrowser for help on using the repository browser.