| 
				
				
					
				
				
				 | 
			
			 | 
			@@ -149,8 +149,8 @@ RULES = { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'term': ['TERMINAL _COLON expansions _NL', | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			             'TERMINAL _DOT NUMBER _COLON expansions _NL'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'statement': ['ignore', 'import', 'declare', 'override_rule'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'override_rule': ['_OVERRIDE rule'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'statement': ['ignore', 'import', 'declare', 'override'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'override': ['_OVERRIDE rule', '_OVERRIDE term'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'ignore': ['_IGNORE expansions _NL'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'declare': ['_DECLARE _declare_args _NL'], | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    'import': ['_IMPORT _import_path _NL', | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -950,6 +950,7 @@ class GrammarLoader: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        # Execute statements | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ignore, imports = [], {} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        overriding_rules = [] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        overriding_terms = [] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for (stmt,) in statements: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if stmt.data == 'ignore': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                t ,= stmt.children | 
		
		
	
	
		
			
				| 
				
					
				
				
					
				
				
				 | 
			
			 | 
			@@ -998,9 +999,15 @@ class GrammarLoader: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            elif stmt.data == 'declare': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                for t in stmt.children: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    term_defs.append([t.value, (None, None)]) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            elif stmt.data == 'override_rule': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            elif stmt.data == 'override': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                r ,= stmt.children | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                overriding_rules.append(options_from_rule(*r.children)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                if r.data == 'rule': | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    overriding_rules.append(options_from_rule(*r.children)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                else: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    if len(r.children) == 2: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        overriding_terms.append((r.children[0].value, (r.children[1], 1))) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    else: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                        overriding_terms.append((r.children[0].value, (r.children[2], int(r.children[1])))) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            else: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                assert False, stmt | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
				| 
				
				
				
					
				
				 | 
			
			 | 
			@@ -1022,6 +1029,16 @@ class GrammarLoader: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                raise GrammarError("Cannot override a nonexisting rule: %s" % name) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            rule_defs.append(r) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        # Same for terminals | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        for t in overriding_terms: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            name = t[0] | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            # remove overridden rule from rule_defs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            overridden, term_defs = classify_bool(term_defs, lambda t: t[0] == name)    # FIXME inefficient | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            if not overridden: | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                raise GrammarError("Cannot override a nonexisting terminal: %s" % name) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            term_defs.append(t) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ## Handle terminals | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        # Verify correctness 1 | 
		
		
	
	
		
			
				| 
				
					
				
				
				
				 | 
			
			 | 
			
  |