1 5 package org.h2.bnf; 6 7 import java.util.ArrayList ; 8 import java.util.HashMap ; 9 10 public class RuleList implements Rule { 11 12 private boolean or; 13 private ArrayList list; 14 private boolean mapSet; 15 16 RuleList(ArrayList list, boolean or) { 17 this.or = or; 18 this.list = list; 19 } 20 21 RuleList(Rule first, Rule next, boolean or) { 22 list = new ArrayList (); 23 if(first instanceof RuleList && ((RuleList)first).or == or) { 24 list.addAll(((RuleList)first).list); 25 } else { 26 list.add(first); 27 } 28 if(next instanceof RuleList && ((RuleList)next).or == or) { 29 list.addAll(((RuleList)next).list); 30 } else { 31 list.add(next); 32 } 33 if(!or && Bnf.COMBINE_KEYWORDS) { 34 for(int i=0; i<list.size()-1; i++) { 35 Rule r1 = (Rule) list.get(i); 36 Rule r2 = (Rule) list.get(i+1); 37 if(!(r1 instanceof RuleElement) || !(r2 instanceof RuleElement)) { 38 continue; 39 } 40 RuleElement re1 = (RuleElement) r1; 41 RuleElement re2 = (RuleElement) r2; 42 if(!re1.isKeyword() || !re2.isKeyword()) { 43 continue; 44 } 45 re1 = re1.merge(re2); 46 list.set(i, re1); 47 list.remove(i+1); 48 i--; 49 } 50 } 51 this.or = or; 52 } 53 54 public String random(Bnf config, int level) { 55 if(or) { 56 if(level > 10) { 57 if(level > 1000) { 58 throw new Error (); 60 } 61 return get(0).random(config, level); 62 } 63 int idx = config.getRandom().nextInt(list.size()); 64 return get(idx).random(config, level+1); 65 } else { 66 StringBuffer buff = new StringBuffer (); 67 for(int i=0; i<list.size(); i++) { 68 buff.append(get(i).random(config, level+1)); 69 } 70 return buff.toString(); 71 } 72 } 73 74 private Rule get(int idx) { 75 return ((Rule)list.get(idx)); 76 } 77 78 public String name() { 79 return null; 80 } 81 82 public Rule last() { 83 return get(list.size()-1); 84 } 85 86 public void setLinks(HashMap ruleMap) { 87 if(!mapSet) { 88 for(int i=0; i<list.size(); i++) { 89 get(i).setLinks(ruleMap); 90 } 91 mapSet = true; 92 } 93 } 94 95 public String matchRemove(String query, Sentence sentence) { 96 if(query.length()==0) { 97 return null; 98 } 99 if(or) { 100 for(int i=0; i<list.size(); i++) { 101 String s = get(i).matchRemove(query, sentence); 102 if(s != null) { 103 return s; 104 } 105 } 106 return null; 107 } else { 108 for(int i=0; i<list.size(); i++) { 109 Rule r = get(i); 110 query = r.matchRemove(query, sentence); 111 if(query == null) { 112 return null; 113 } 114 } 115 return query; 116 } 117 } 118 119 public void addNextTokenList(String query, Sentence sentence) { 120 if(sentence.stop()) { 121 } 123 if(or) { 124 for(int i=0; i<list.size(); i++) { 125 get(i).addNextTokenList(query, sentence); 126 } 127 } else { 128 for(int i=0; i<list.size(); i++) { 129 Rule r = get(i); 130 r.addNextTokenList(query, sentence); 131 query = r.matchRemove(query, sentence); 132 if(query == null) { 133 break; 134 } 135 } 136 } 137 } 138 139 } 140 | Popular Tags |