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

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

Updated regular expression grammar to correctly order the escape characters recognizers within the context of character classes.

File size: 3.9 KB
Line 
1// Ken Herdy
2//
3// Scatter grammar for regular expressions.
4//
5// Supports context dependent lexical analysis.
6//
7// 31-09-2012   Original definition.
8// 04-25-2013   Character-by-character lexical analysis, any , sos, eos, bounded repetition (all types).
9// 04-27-2013   Negated character classes.
10// 05-03-2013   Escaped character recognition (unicode, hex, single character).
11//
12
13types {}
14
15context main {
16        recognizers {
17                Whitespace [IGNORE],
18                Escape[UNICODE_ESCAPE]                          "\\u" "0123456789abcdefABCDEF" 4 4 16, // prefix, char set, min, max, radix
19                Escape[HEXADECIMAL_ESCAPE]                  "\\x" "0123456789abcdefABCDEF" 2 2 16,
20                Escape[CHARACTER_ESCAPE]                        "\\" "[.]" 1 1,
21                Punctuator,
22                Comment [IGNORE] "(?#" ")",         // comments
23                EndOfInput,                         // must precede CHARACTER
24                Character [CHARACTER],              // non-punctuators 
25        }
26
27        tokens { 
28                LEFTROUND         "(",         
29                RIGHTROUND        ")",
30                LEFTSQUARENEGATE  "[^",
31                LEFTSQUARE        "[",   
32                LEFTCURLY         "{",   
33                OR                "|",
34                OPTIONAL          "?",
35                STAR              "*",
36                PLUS              "+",
37                ANY               ".",
38                SOS               "^", 
39                EOS               "$", 
40        //BACKSLASH       "\\",
41        }
42}
43
44context charClass {     
45        recognizers {
46                // Whitespace [IGNORE],                 // POSIX standard
47                Escape[UNICODE_ESCAPE]          "\\u" "0123456789abcdefABCDEF" 4 4 16,
48                Escape[HEXADECIMAL_ESCAPE]      "\\x" "0123456789abcdefABCDEF" 2 2 16,
49                Escape[CHARACTER_ESCAPE]        "\\" "[.]" 1 1,
50                Punctuator,
51                EndOfInput,                     // must precede CHARACTER
52                Character [CHARACTER],          // non-punctuators
53        }       
54        tokens {
55                RIGHTSQUARE   "]",
56                THROUGH       "-",
57            //NOT         "^",
58            //BACKSLASH   "\\",
59        }
60}
61
62context boundedRepetition {
63        recognizers {
64                Whitespace [IGNORE],
65                Punctuator,
66                Integer [INTEGER_CONST],
67                EndOfInput,
68        }       
69        tokens {
70                RIGHTCURLY "}",
71                COMMA           ",",
72        }
73}
74
75interfaces {
76        repeatable{boolean isRepeated = true;},
77        intValued {int value = 0;},
78        intRange{int lowerBound = 0; int upperBound = 0;},
79}
80
81nodes {
82        lowerBound{intValued;} [],
83        upperBound{intValued;} [],
84        repetitionIndicator{intRange;} [boundedRepetitionIndicator],
85}
86
87grammar {
88        start                       -> re ;
89        re                                  #-> alternation ;
90        alternation         #-> concatenation (OR↑ concatenation)* ; 
91        concatenation       #-> repetition+ ;                                           
92        repetition                  #-> atom (repetitionIndicator | boundedRepetitionIndicator)?;
93        repetitionIndicator ->   OPTIONAL {@lowerBound = 0; @upperBound = 1;} |
94                                                         STAR {@lowerBound = 0; @upperBound = -1;} |
95                             PLUS {@lowerBound = 1; @upperBound = -1;};
96                                                       
97        boundedRepetitionIndicator      -> LEFTCURLY◊ (boundedRepetition)
98                                                                          ( lowerBound! {@lowerBound = @:value;} )
99                                                                          (
100                                                                              (COMMA upperBound!   {@upperBound = @:value;}     ) |
101                                                                              (epsilon             {@upperBound = @lowerBound;} )
102                                                                          ) RIGHTCURLY◊ ;
103                                                                 
104        lowerBound              -> INTEGER_CONST {@value = @@value;} | epsilon {@value = 0;} ;
105        upperBound              -> INTEGER_CONST {@value = @@value;} | epsilon {@value = -1;} ;                                         
106       
107        atom          #-> LEFTROUND re RIGHTROUND |
108                    char                    |
109                    characterClass          |
110                    negatedCharacterClass   |
111                    any                     |
112                    sos                     |
113                    eos ;
114       
115        char              -> CHARACTER           |
116                         CHARACTER_ESCAPE    |
117                         HEXADECIMAL_ESCAPE  |
118                         UNICODE_ESCAPE ;
119               
120        characterClass  ->      LEFTSQUARE
121                        ◊(charClass) range* RIGHTSQUARE◊ ;
122                                               
123        negatedCharacterClass   ->   LEFTSQUARENEGATE
124                                 â—Š(charClass) range* RIGHTSQUARE◊ ;                                 
125                                                                                 
126        range                   #-> char (THROUGH↑ char)? ;
127
128        any                             -> ANY ;
129        sos                             -> SOS ;
130        eos                             -> EOS ;
131       
132        // backslash -> BACKSLASH ;
133}
Note: See TracBrowser for help on using the repository browser.