1 package fri.patterns.interpreter.parsergenerator.lexer; 2 3 import java.util.*; 4 import java.io.*; 5 import fri.util.Equals; 6 import fri.patterns.interpreter.parsergenerator.syntax.Rule; 7 8 15 16 class ConsumerAlternatives extends Consumer 17 { 18 private List alternates = new ArrayList(3); 19 private StrategyFactoryMethod strategyFactoryMethod; 20 private Strategy strategy; 21 22 23 24 ConsumerAlternatives(Consumer alternateConsumer) { 25 addAlternate(alternateConsumer); 26 } 27 28 29 30 public void addAlternate(Consumer alternateConsumer) { 31 alternates.add(alternateConsumer); 32 } 33 34 39 public List getAlternatives() { 40 return alternates; 41 } 42 43 44 boolean matchesRepeatableRule(Rule rule) { 45 for (int i = 0; i < alternates.size(); i++) { 46 Consumer ac = (Consumer)alternates.get(i); 47 if (ac.matchesRepeatableRule(rule)) 48 return true; 49 } 50 return false; 51 } 52 53 54 public Character getStartCharacter() { 55 Character c = null; 56 57 for (int i = 0; i < alternates.size(); i++) { 58 Consumer cc = (Consumer)alternates.get(i); 59 Character c1 = cc.getStartCharacter(); 60 61 if (i == 0) 62 c = c1; 63 else 64 if (Equals.equals(c, c1) == false) 65 return null; 66 } 67 68 return c; 69 } 70 71 75 public int getStartVariance() { 76 if (getStartCharacter() != null) 77 return 1; 78 79 int v = 0; 80 for (int i = 0; i < alternates.size(); i++) 81 v += ((Consumer) alternates.get(i)).getStartVariance(); 82 83 return v; 84 } 85 86 93 protected int getSomeLength(boolean exploreStartLength, List breakIndicator) { 94 int max = 0; 95 for (int i = 0; i < alternates.size(); i++) { 96 Consumer cc = (Consumer)alternates.get(i); 97 int len = cc.getSomeLength(exploreStartLength, breakIndicator); 98 if (len > max) 99 max = len; 100 } 101 return max; 102 } 103 104 105 110 protected ResultTree consumeInternal(InputText input) 111 throws IOException 112 { 113 if (strategy == null) { strategy = strategyFactoryMethod != null ? strategyFactoryMethod.newStrategy() : new Strategy(); 115 116 for (int i = 0; i < alternates.size(); i++) { 117 Consumer cc = (Consumer) alternates.get(i); 118 strategy.addTokenConsumer(cc.rule.getNonterminal(), cc); 119 } 120 } 121 122 Strategy.Item item = strategy.consume(input, input.peek(), null); 123 if (item != null) 124 return item.getResultTree(); 125 126 return null; 127 } 128 129 130 131 public boolean overlaps(Consumer cc) { 132 for (int i = 0; i < alternates.size(); i++) { 133 Consumer ac = (Consumer) alternates.get(i); 134 if (ac.overlaps(cc)) 135 return true; 136 } 137 return false; 138 } 139 140 141 142 protected String toStringBase() { 143 StringBuffer sb = new StringBuffer (); 144 listToString(alternates, sb, " | ", false); 145 return sb.toString(); 146 } 147 148 149 150 public void setStrategyFactoryMethod(StrategyFactoryMethod strategyFactoryMethod) { 151 this.strategyFactoryMethod = strategyFactoryMethod; 152 153 for (int i = 0; i < alternates.size(); i++) { 154 Consumer c = (Consumer) alternates.get(i); 155 c.setStrategyFactoryMethod(strategyFactoryMethod); 156 } 157 } 158 159 } | Popular Tags |