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

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

Replaced remaining non-Ascii symbols with ASCII equivalents. Added TODO for RadixEscape? / CharacterEscape? recognizers.

File size: 4.3 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// KS: TODO     Add     
13//              RadixEscape [CHARACTER]     "\\x" 2 2 16,
14//              RadixEscape [CHARACTER]     "\\u" 4 4 16,
15//              CharacterEscape [CHARACTER]    "\\"  "java",
16//              Character [CHARACTER],          // non-punctuators
17//
18//              change the "java" argument on CharacterEscape
19//              char            → CHARACTER ;
20//   
21//              A synopsis called RadixEscape and CharacterEscape can be found
22//              in scatter/doc/inputDoc.html.
23
24types {}
25
26context main {
27        recognizers {
28                Whitespace [IGNORE],
29                Escape[UNICODE_ESCAPE]          "\\u" "0123456789abcdefABCDEF" 4 4 16, // prefix, char set, min, max, radix   // Radix
30                Escape[HEXADECIMAL_ESCAPE]      "\\x" "0123456789abcdefABCDEF" 2 2 16,                                        // Radix
31                Escape[CHARACTER_ESCAPE]        "\\" "[.]" 1 1,                                                               // Char   
32                Punctuator,
33                Comment [IGNORE] "(?#" ")",     // comments
34                EndOfInput,                   // must precede CHARACTER
35                Character [CHARACTER],        // non-punctuators       
36        }
37
38        tokens { 
39                LEFTROUND         "(",         
40                RIGHTROUND        ")",
41                LEFTSQUARENEGATE  "[^",
42                LEFTSQUARE        "[",   
43                LEFTCURLY         "{",   
44                OR                "|",
45                OPTIONAL          "?",
46                STAR              "*",
47                PLUS              "+",
48                ANY               ".",
49                SOS               "^", 
50                EOS               "$", 
51        //BACKSLASH       "\\",
52        }
53}
54
55context charClass {     
56        recognizers {
57                // Whitespace [IGNORE],         // POSIX standard
58                Escape[UNICODE_ESCAPE]          "\\u" "0123456789abcdefABCDEF" 4 4 16,
59                Escape[HEXADECIMAL_ESCAPE]      "\\x" "0123456789abcdefABCDEF" 2 2 16,
60                Escape[CHARACTER_ESCAPE]        "\\" "[.]" 1 1,
61                Punctuator,
62                EndOfInput,                 // must precede CHARACTER
63                Character [CHARACTER],      // non-punctuators
64        }       
65        tokens {
66                RIGHTSQUARE   "]",
67                THROUGH       "-",
68                //NOT         "^",
69                //BACKSLASH   "\\",
70        }
71}
72
73context boundedRepetition {
74        recognizers {
75                Whitespace [IGNORE],
76                Punctuator,
77                Integer [INTEGER_CONST],
78                EndOfInput,
79        }       
80        tokens {
81                RIGHTCURLY "}",
82                COMMA           ",",
83        }
84}
85
86interfaces {
87        repeatable{boolean isRepeated = true;},
88        intValued {int value = 0;},
89        intRange{int lowerBound = 0; int upperBound = 0;},
90}
91
92nodes {
93        lowerBound{intValued;} [],
94        upperBound{intValued;} [],
95        repetitionIndicator{intRange;} [boundedRepetitionIndicator],
96}
97
98grammar {
99        start                   -> re ;
100        re                      #-> alternation ;
101        alternation             #-> concatenation (OR^ concatenation)* ;
102        concatenation           #-> repetition+ ;
103        repetition              -> atom (repetitionIndicator | boundedRepetitionIndicator)?;
104        repetitionIndicator     ->      OPTIONAL {@lowerBound = 0; @upperBound = 1;} |
105                                        STAR {@lowerBound = 0; @upperBound = -1;} |
106                                        PLUS {@lowerBound = 1; @upperBound = -1;};
107                                                       
108        boundedRepetitionIndicator      -> LEFTCURLY<> (boundedRepetition)
109                                                  ( lowerBound! {@lowerBound = @:value;} )
110                                                  (
111                                                      (COMMA upperBound!   {@upperBound = @:value;}     ) |
112                                                      (epsilon             {@upperBound = @lowerBound;} )
113                                                  ) RIGHTCURLY<> ;
114                                                                 
115        lowerBound              -> INTEGER_CONST {@value = @@value;} | epsilon {@value = 0;} ;
116        upperBound              -> INTEGER_CONST {@value = @@value;} | epsilon {@value = -1;} ;
117       
118        atom            #-> LEFTROUND re RIGHTROUND     |
119                    char                        |
120                    characterClass          |
121                    negatedCharacterClass   |
122                    any                     |
123                    sos                     |
124                    eos ;
125       
126        char           ->   CHARACTER           |
127                        CHARACTER_ESCAPE    |
128                        HEXADECIMAL_ESCAPE  |
129                        UNICODE_ESCAPE ;
130               
131        characterClass  -> LEFTSQUARE <>(charClass) range* RIGHTSQUARE<> ;
132                                               
133        negatedCharacterClass   -> LEFTSQUARENEGATE <>(charClass) range* RIGHTSQUARE<> ;                                       
134                                                                                 
135        range                   #-> char (THROUGH^ char)? ;
136
137        any                             -> ANY ;
138        sos                             -> SOS ;
139        eos                             -> EOS ;
140       
141        // backslash -> BACKSLASH ;
142}
Note: See TracBrowser for help on using the repository browser.