source: proto/RE2PBS/re2pbs.g @ 1130

Last change on this file since 1130 was 1130, checked in by ksherdy, 9 years ago

Initial check in.

File size: 4.2 KB
Line 
1/*
2
3  AnTLR Grammar (Python)
4
5  Regular Expressions to Parallel Bit Stream equation generator.
6
7  Copyright (c) 2011, Ken Herdy
8
9  Version 0.7 - April 15, 2011
10 
11      Restricted meta character handling. All meta characters (character class meta characters, global regular expression meta characters)
12      must be escaped at all scopes/context.
13      Use of hexadecimal escapes to specify newline characters.
14      Support alternation, concatenation, repetition operators ('?','+','*')
15
16  Version 0.8
17
18      TODO -    Two pass implementation to support regular expression escape characters at both the
19                the global and character class scopes.
20               
21                i.e.    Pass One - Character class scope pass.
22                        Pass Two - Global scope pass.
23*/
24grammar re2pbs;
25
26options {       
27        language = Python;
28}
29
30@header {
31        from re2pbs import *
32        from codepoint_symbol_table import CodePointSymbolTable, CodePointSymbol, CodePointLists2CharSetDefList
33        from charset_compiler import chardeflist2py
34        from charset_def import CharSetDef
35}
36
37@members {
38        symbol_table = CodePointSymbolTable()
39}
40
41@lexer::header {
42}
43
44@lexer::members {
45}
46
47prog    :       re EOF
48{
49        defs = []
50        for key, symbol in self.symbol_table.symbols.items():
51                defs.append(CharSetDef(key, CodePointLists2CharSetDefList(symbol.codepoints), symbol.invert))
52        print chardeflist2py(defs)
53}
54        ;
55               
56re      :       union?
57        ;       
58       
59union   :       concatenation (Or concatenation)*
60        ;
61       
62concatenation
63@init {
64        object = Concatenation()
65}
66@after {
67        #print object.debug()
68}
69        : (atom {object.atom_list.append($atom.object.debug())})+
70        ;       
71
72atom returns [object]
73@init {
74        symbol = CodePointSymbol()     
75        object = Atom()     
76}
77@after {
78       
79        self.symbol_table.insert(symbol.key(), symbol)                 
80        #print object.debug()
81}
82        :
83        (
84        single  {
85                        symbol.add_codepoint($single.object.codepoint)
86                        object.strm_name = symbol.key()
87                }
88        |
89        characterClass 
90                {       
91                        for obj in $characterClass.object.single_or_range:
92                                if isinstance(obj,Single):
93                                        symbol.add_codepoint(obj.codepoint, $characterClass.object.invert)
94                                elif isinstance(obj,Range):
95                                        symbol.add_codepoint_range(obj.codepoint_lower, obj.codepoint_upper, $characterClass.object.invert)
96                        object.strm_name = symbol.key()
97                }
98        )
99        (Quantifier {object.quantifier = $Quantifier.text})?
100        ;
101       
102characterClass  returns [object]
103@init {
104        object = CharacterClass()
105}
106@after {
107        #object.debug()
108}
109        :
110        SquareBracketStart                     
111        (Caret  {object.invert = True})?
112        (
113        range           {object.single_or_range.append($range.object)}
114        |
115        single          {object.single_or_range.append($single.object)}
116        )+
117        SquareBracketEnd                       
118        ;
119       
120range   returns [object]
121@init{
122        object = Range()
123}
124@after {
125        #object.debug()
126}
127        :       lb = single {object.codepoint_lower = $lb.object.codepoint}     
128               
129                Hyphen
130               
131                ub = single {object.codepoint_upper = $ub.object.codepoint}     
132                                                                       
133        ;       
134       
135single  returns [object]
136@init{
137        object = Single()
138}
139@after {
140        #object.debug()
141}
142        : i = UnicodeCharacter                                  {object.codepoint = int($i.text[2:],16)}
143                                                                       
144        | j = SmallHexNumber                                    {object.codepoint = int($j.text[2:],16)}
145                                                                       
146        | k = EscapeSuperMetaCharacter                          {object.codepoint = ord($k.text[1:])}
147
148        | l = NotSuperMetaCharacter                             {object.codepoint = ord($l.text[(len($l.text)-1):])}
149                                                                                                                                               
150        ;       
151
152// Lexical
153NewLine            :  ('\r''\n' | '\n' | '\r' )     {$channel=HIDDEN;}  ; // LFCR - Windows | LF - Unix | CR - Mac --> Specifiy using Unicode or Small Hex Escape
154
155// Supermetacharacters
156Escape             :  '\\'     ;
157Or                 :  '|'      ;
158SquareBracketStart :  '['      ;       
159Hyphen             :  '-'      ;       
160Caret              :  '^'      ;       
161SquareBracketEnd   :  ']'      ;       
162
163
164UnicodeCharacter
165        : Escape 'u' HexDigit HexDigit HexDigit HexDigit
166        ;       
167
168SmallHexNumber
169        : Escape 'x' HexDigit HexDigit
170        ;
171
172fragment
173HexDigit
174        : ('0'..'9' | 'a'..'f' | 'A'..'F')
175        ;
176
177EscapeSuperMetaCharacter
178        : Escape SuperMetaCharacters
179        ;
180       
181NotSuperMetaCharacter
182        : ~(SuperMetaCharacters)
183        ;       
184       
185fragment
186SuperMetaCharacters
187        : (QuestionMark | Star | Cross | Or | SquareBracketStart | SquareBracketEnd | Hyphen | Escape | Caret)
188        ;
189       
190Quantifier
191        :  QuestionMark
192        |  Star
193        |  Cross
194        ;       
195
196fragment
197QuestionMark       :  '?'      ;       
198
199fragment
200Star               :  '*'      ;       
201
202fragment
203Cross              :  '+'      ;       
204
Note: See TracBrowser for help on using the repository browser.