| OLD | NEW |
| 1 # Copyright 2013 the V8 project authors. All rights reserved. | 1 # Copyright 2013 the V8 project authors. All rights reserved. |
| 2 # Redistribution and use in source and binary forms, with or without | 2 # Redistribution and use in source and binary forms, with or without |
| 3 # modification, are permitted provided that the following conditions are | 3 # modification, are permitted provided that the following conditions are |
| 4 # met: | 4 # met: |
| 5 # | 5 # |
| 6 # * Redistributions of source code must retain the above copyright | 6 # * Redistributions of source code must retain the above copyright |
| 7 # notice, this list of conditions and the following disclaimer. | 7 # notice, this list of conditions and the following disclaimer. |
| 8 # * Redistributions in binary form must reproduce the above | 8 # * Redistributions in binary form must reproduce the above |
| 9 # copyright notice, this list of conditions and the following | 9 # copyright notice, this list of conditions and the following |
| 10 # disclaimer in the documentation and/or other materials provided | 10 # disclaimer in the documentation and/or other materials provided |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 assert not rules['default_action'] | 113 assert not rules['default_action'] |
| 114 rules['default_action'] = action | 114 rules['default_action'] = action |
| 115 elif p[1] == 'catch_all': | 115 elif p[1] == 'catch_all': |
| 116 assert not rules['catch_all'] | 116 assert not rules['catch_all'] |
| 117 rules['catch_all'] = (precedence, action) | 117 rules['catch_all'] = (precedence, action) |
| 118 else: | 118 else: |
| 119 regex = p[1] | 119 regex = p[1] |
| 120 rules['regex'].append((regex, precedence, action)) | 120 rules['regex'].append((regex, precedence, action)) |
| 121 | 121 |
| 122 def p_action(self, p): | 122 def p_action(self, p): |
| 123 '''action : ACTION_OPEN maybe_action_part OR maybe_action_part OR maybe_tran
sition ACTION_CLOSE''' | 123 '''action : ACTION_OPEN maybe_identifier_action OR maybe_identifier_action O
R maybe_transition ACTION_CLOSE''' |
| 124 p[0] = (p[2], p[4], p[6]) | 124 p[0] = (p[2], p[4], p[6]) |
| 125 | 125 |
| 126 def p_default_action(self, p): | 126 def p_default_action(self, p): |
| 127 'default_action : ACTION_OPEN action_part ACTION_CLOSE' | 127 'default_action : ACTION_OPEN identifier_action ACTION_CLOSE' |
| 128 p[0] = (None, p[2], None) | 128 p[0] = (None, p[2], None) |
| 129 | 129 |
| 130 def p_maybe_action_part(self, p): | 130 def p_maybe_identifier_action(self, p): |
| 131 '''maybe_action_part : action_part | 131 '''maybe_identifier_action : identifier_action |
| 132 | empty''' | 132 | empty''' |
| 133 p[0] = p[1] | 133 p[0] = p[1] |
| 134 | 134 |
| 135 def p_action_part(self, p): | |
| 136 '''action_part : code | |
| 137 | identifier_action''' | |
| 138 p[0] = p[1] | |
| 139 | |
| 140 def p_maybe_transition(self, p): | 135 def p_maybe_transition(self, p): |
| 141 '''maybe_transition : IDENTIFIER | 136 '''maybe_transition : IDENTIFIER |
| 142 | empty''' | 137 | empty''' |
| 143 p[0] = p[1] | 138 p[0] = p[1] |
| 144 | 139 |
| 145 def p_identifier_action(self, p): | 140 def p_identifier_action(self, p): |
| 146 '''identifier_action : IDENTIFIER | 141 '''identifier_action : IDENTIFIER |
| 147 | IDENTIFIER LEFT_PARENTHESIS RIGHT_PARENTHESIS | 142 | IDENTIFIER LEFT_PARENTHESIS RIGHT_PARENTHESIS |
| 148 | IDENTIFIER LEFT_PARENTHESIS action_params RIGHT_PAREN
THESIS''' | 143 | IDENTIFIER LEFT_PARENTHESIS action_params RIGHT_PAREN
THESIS''' |
| 149 assert p[1] != 'code' | |
| 150 if len(p) == 2 or len(p) == 4: | 144 if len(p) == 2 or len(p) == 4: |
| 151 p[0] = (p[1], None) | 145 p[0] = (p[1], None) |
| 152 elif len(p) == 5: | 146 elif len(p) == 5: |
| 153 if len(p[3]) == 1: | 147 if len(p[3]) == 1: |
| 154 p[0] = (p[1], p[3][0]) | 148 p[0] = (p[1], p[3][0]) |
| 155 else: | 149 else: |
| 156 p[0] = (p[1], p[3]) | 150 p[0] = (p[1], p[3]) |
| 157 else: | 151 else: |
| 158 raise Exception() | 152 raise Exception() |
| 159 | 153 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 'regex_alias : IDENTIFIER' | 207 'regex_alias : IDENTIFIER' |
| 214 p[0] = self.__state.aliases[p[1]] | 208 p[0] = self.__state.aliases[p[1]] |
| 215 | 209 |
| 216 def p_modifier(self, p): | 210 def p_modifier(self, p): |
| 217 '''modifier : PLUS | 211 '''modifier : PLUS |
| 218 | QUESTION_MARK | 212 | QUESTION_MARK |
| 219 | STAR | 213 | STAR |
| 220 | empty''' | 214 | empty''' |
| 221 p[0] = p[1] | 215 p[0] = p[1] |
| 222 | 216 |
| 223 def p_code(self, p): | |
| 224 'code : LEFT_BRACKET code_fragments RIGHT_BRACKET' | |
| 225 p[0] = ('code', p[2].strip()) | |
| 226 | |
| 227 def p_code_fragments(self, p): | |
| 228 '''code_fragments : CODE_FRAGMENT code_fragments | |
| 229 | empty''' | |
| 230 p[0] = p[1] | |
| 231 if len(p) == 3 and p[2]: | |
| 232 p[0] = p[1] + p[2] | |
| 233 | |
| 234 def p_empty(self, p): | 217 def p_empty(self, p): |
| 235 'empty :' | 218 'empty :' |
| 236 | 219 |
| 237 def p_error(self, p): | 220 def p_error(self, p): |
| 238 raise Exception("Syntax error in input '%s'" % str(p)) | 221 raise Exception("Syntax error in input '%s'" % str(p)) |
| 239 | 222 |
| 240 def build(self, **kwargs): | 223 def build(self, **kwargs): |
| 241 self.parser = yacc.yacc(module=self, debug=0, write_tables=0, **kwargs) | 224 self.parser = yacc.yacc(module=self, debug=0, write_tables=0, **kwargs) |
| 242 self.lexer = RuleLexer() | 225 self.lexer = RuleLexer() |
| 243 self.lexer.build(**kwargs) | 226 self.lexer.build(**kwargs) |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 for k, v in parser_state.rules.items(): | 324 for k, v in parser_state.rules.items(): |
| 342 if k == 'default': continue | 325 if k == 'default': continue |
| 343 process(k, v) | 326 process(k, v) |
| 344 process('default', parser_state.rules['default']) | 327 process('default', parser_state.rules['default']) |
| 345 # build the automata | 328 # build the automata |
| 346 for rule_name, graph in rule_map.items(): | 329 for rule_name, graph in rule_map.items(): |
| 347 self.__automata[rule_name] = RuleProcessor.Automata(builder, graph) | 330 self.__automata[rule_name] = RuleProcessor.Automata(builder, graph) |
| 348 # process default_action | 331 # process default_action |
| 349 default_action = parser_state.rules['default']['default_action'] | 332 default_action = parser_state.rules['default']['default_action'] |
| 350 self.default_action = Action(None, default_action[1]) if default_action else
None | 333 self.default_action = Action(None, default_action[1]) if default_action else
None |
| OLD | NEW |