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

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

Alignment.

File size: 3.7 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 ◊(charClass) range* RIGHTSQUARE◊ ;
121                                               
122        negatedCharacterClass   -> LEFTSQUARENEGATE ◊(charClass) range* RIGHTSQUARE◊ ;                                     
123                                                                                 
124        range                   #-> char (THROUGH↑ char)? ;
125
126        any                             -> ANY ;
127        sos                             -> SOS ;
128        eos                             -> EOS ;
129       
130        // backslash -> BACKSLASH ;
131}
Note: See TracBrowser for help on using the repository browser.