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

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

Updated grammar.

File size: 3.6 KB
Line 
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.
10//
11
12types {}
13
14context main {
15        recognizers {
16                Whitespace [IGNORE],
17                Punctuator,
18                Comment [IGNORE] "(?#" ")",
19                EndOfInput,                             // must precede Character or loops
20                Character [CHARACTER], 
21        }
22
23        tokens { 
24                LEFTROUND       "(",    RIGHTROUND              ")",
25                LEFTSQUARE      "[",     
26                LEFTCURLY       "{",    // non standard meta-character
27
28                OR                      "|",
29                OPTIONAL        "?",
30                STAR            "*",
31                PLUS            "+",
32               
33                ANY             ".",
34                SOS             "^",    // start-of-string
35                EOS                     "$",    // end-of-string, non-standard, '$' is standard
36
37                BACKSLASH       "\\",
38        }
39}
40
41context charClass {     
42        recognizers {
43                Whitespace [IGNORE],
44                Punctuator,
45                Character [CHARACTER], // non meta-characters (punctuators)
46                EndOfInput,
47        }       
48        tokens {
49                RIGHTSQUARE "]",
50                NOT             "^",
51                THROUGH         "-",
52                BACKSLASH       "\\",
53        }
54}
55
56context boundedRepetition {
57        recognizers {
58                Whitespace [IGNORE],
59                Punctuator,
60                Integer [INTEGER_CONST],
61                EndOfInput,
62        }       
63        tokens {
64                RIGHTCURLY "}",
65                COMMA           ",",
66        }
67}
68
69interfaces {
70        escapable {boolean isEscape = false;}, //  boolean isHexEscape = false; boolean isUnicodeEscape = false;},
71        complementable {boolean isComplemented = false;},
72        repeatable {boolean isRange = false;},
73        intValued {int value = 0;},
74}
75
76nodes {
77        char {escapable;} [escapedChar characterClassChar characterClassEscapedChar],
78        characterClass {complementable;} [],
79        lowerBound{intValued;} [],
80        upperBound{intValued;} [],
81        boundedRepetitionIndicator{repeatable;} [],
82}
83//
84// to change scanning contexts, use the ◊ operator (in ascii: <> ).
85// ◊(contextName) pushes the context on a stack, ◊ with nothing
86// following it pops the current context from the stack.
87// ◊ works only when applied to a terminal; do not apply to a nonterminal.
88// see the production for characterClass below, where everything from
89// "◊(charClass)" to "◊" is done in the "charClass" scanning context.
90// Note that this means that RIGHTSQUARE must be recognized in the
91// "charClass" context.
92grammar {
93        start                   â†’ re ;
94        re                              ʉ → alternation ;
95        alternation     Ê‰ → concatenation (OR↑ concatenation)* ;   
96        concatenation   Ê‰ → repetition+ ;                                           
97        repetition              ʉ → atom (repetitionIndicator | boundedRepetitionIndicator)?; // ↑↑!? ;
98       
99        repetitionIndicator             â†’ OPTIONAL | STAR | PLUS ;
100                                                       
101        boundedRepetitionIndicator      → LEFTCURLY◊(boundedRepetition) (lowerBound)? (COMMA {@isRange=true;} (upperBound)? )? RIGHTCURLY◊ ;
102       
103        lowerBound              -> INTEGER_CONST {@value = @@value;} ;
104        upperBound              -> INTEGER_CONST {@value = @@value;} ;                                         
105       
106        atom                    ʉ → LEFTROUND re RIGHTROUND | char | characterClass | any | sos | eos ;
107       
108        char                    ʉ → CHARACTER | BACKSLASH escapedChar {@:isEscape = true;} ;
109    escapedChar         â†’     CHARACTER | LEFTROUND | RIGHTROUND | LEFTSQUARE | LEFTCURLY | COMMA | OR | OPTIONAL | STAR | PLUS | ANY | SOS | EOS | BACKSLASH | LEFTCURLY;
110               
111        characterClass  →     LEFTSQUARE◊(charClass)
112                                                        (NOT {@isComplemented = true;})?
113                                                        range*
114                                                RIGHTSQUARE◊ ;
115                                         
116        range                   Ê‰ → characterClassChar (THROUGH↑ characterClassChar)? ;
117         
118        characterClassChar                      ʉ → CHARACTER | BACKSLASH characterClassEscapedChar {@:isEscape = true;} ;
119    characterClassEscapedChar   â†’ CHARACTER | NOT | THROUGH | BACKSLASH | RIGHTSQUARE;
120
121        any                             â†’ ANY ;
122        sos                             â†’ SOS ;
123        eos                             â†’ EOS ;
124}
Note: See TracBrowser for help on using the repository browser.