1 package fri.patterns.interpreter.parsergenerator.syntax.builder; 2 3 import java.util.*; 4 import fri.patterns.interpreter.parsergenerator.Semantic; 5 import fri.patterns.interpreter.parsergenerator.Token; 6 import fri.patterns.interpreter.parsergenerator.syntax.*; 7 8 24 25 public class SyntaxBuilderSemantic implements Semantic 26 { 27 public static String [][] syntax = { 28 { "syntax", "syntax", "rule" }, { "syntax", "rule" }, 31 32 { "set", "`bnf_chardef`", "\""+Token.UPTO+"\"", "`bnf_chardef`" }, 34 { "intersectionstartunit", "set" }, { "intersectionstartunit", "`identifier`" }, 36 { "intersectionstartunit", "`ruleref`" }, 37 38 { "intersectionunit", "`bnf_chardef`" }, 39 { "intersectionunit", "`stringdef`" }, 40 { "intersectionunit", "intersectionstartunit" }, 41 42 { "intersectionsubtracts", "intersectionsubtracts", "intersectionsubtract" }, 43 { "intersectionsubtracts", "intersectionsubtract" }, 44 { "intersectionsubtract", "'"+Token.BUTNOT+"'", "intersectionunit" }, 45 46 { "intersection", "intersectionstartunit", "intersectionsubtracts" }, 47 48 { "sequnit", "intersection" }, { "sequnit", "intersectionunit" }, 50 { "sequnit", "'('", "unionseq", "')'" }, 51 52 { "quantifiedsequnit", "sequnit", "`quantifier`" }, { "quantifiedsequnit", "sequnit" }, 54 55 { "sequence", "sequence", "quantifiedsequnit" }, { "sequence", "quantifiedsequnit" }, 57 58 { "sequence_opt", "sequence" }, { "sequence_opt", }, 60 61 { "unionseq", "unionseq", "'|'", "sequence_opt" }, { "unionseq", "sequence_opt" }, 63 64 { "rule", "`identifier`", "\"::=\"", "unionseq", "';'" }, 66 }; 71 72 private List initialNonterminals; 73 74 75 78 public SyntaxBuilderSemantic() { 79 this(null); 80 } 81 82 86 public SyntaxBuilderSemantic(List initialNonterminals) { 87 this.initialNonterminals = initialNonterminals; 88 } 89 90 91 public Object doSemantic(Rule rule, List inputTokens, List ranges) { 92 String nt = rule.getNonterminal(); 93 94 if (nt.equals("set")) 95 return inputTokens; 96 97 if (nt.equals("intersectionstartunit") || nt.equals("intersectionunit")) 98 return inputTokens.get(0); 99 100 if (nt.equals("intersectionsubtract")) 101 return inputTokens; 102 103 if (nt.equals("intersectionsubtracts")) 104 if (inputTokens.size() == 2) 105 return appendAll((List) inputTokens.get(0), (List)inputTokens.get(1)); 106 else 107 return inputTokens.get(0); 108 109 if (nt.equals("intersection")) 110 return insertAtStart(inputTokens.get(0), (List) inputTokens.get(1)); 111 112 if (nt.equals("sequnit")) 113 if (inputTokens.size() == 3) 114 return sequnitInParenthesis(inputTokens.get(1)); 115 else 116 return inputTokens.get(0); 117 118 if (nt.equals("quantifiedsequnit")) 119 if (inputTokens.size() == 2) 120 return quantifiedsequnit(inputTokens.get(0), inputTokens.get(1)); 121 else 122 return inputTokens.get(0); 123 124 if (nt.equals("sequence")) 125 if (inputTokens.size() == 2) 126 return append((List) inputTokens.get(0), inputTokens.get(1)); 127 else 128 return inputTokens; 129 130 if (nt.equals("sequence_opt")) 131 return inputTokens; 132 133 if (nt.equals("unionseq")) 134 if (inputTokens.size() == 3) 135 return append((List) inputTokens.get(0), (List) inputTokens.get(2)); 136 else 137 return inputTokens; 138 139 if (nt.equals("rule")) 140 return rule((String ) inputTokens.get(0), (List) inputTokens.get(2)); 141 142 if (nt.equals("syntax")) 143 if (inputTokens.size() == 2) 144 return syntax((List) inputTokens.get(0), (List) inputTokens.get(1)); 145 else 146 return inputTokens.get(0); 147 148 throw new IllegalArgumentException ("Unknown rule: "+rule); 149 } 150 151 152 private ArtificialRule sequnitInParenthesis(Object unionseq) { 153 return new ArtificialRule((List)unionseq, "OR"); 154 } 155 156 private ArtificialRule quantifiedsequnit(Object sequnit, Object quantifier) { 157 return new ArtificialRule(sequnit, (String )quantifier); 158 } 159 160 private List append(List list, Object element) { 161 list.add(element); 162 return list; 163 } 164 165 private List appendAll(List list, List elements) { 166 for (int i = 0; i < elements.size(); i++) 167 list.add(elements.get(i)); 168 return list; 169 } 170 171 private List insertAtStart(Object intersectionStart, List intersectionList) { 172 intersectionList.add(0, intersectionStart); 173 return intersectionList; 174 } 175 176 private List rule(String identifier, List unionseq) { 177 if (initialNonterminals != null && initialNonterminals.indexOf(identifier) < 0) 178 initialNonterminals.add(identifier); 179 180 for (int i = 0; i < unionseq.size(); i++) { 181 List deep = (List) unionseq.get(i); 182 List flat = ArtificialRule.flattenLists(deep, new ArrayList()); 183 flat.add(0, identifier); 184 unionseq.set(i, flat); 185 } 186 return unionseq; 187 } 188 189 private List syntax(List syntax, List rule) { 190 for (int i = 0; i < rule.size(); i++) 191 syntax.add((List) rule.get(i)); 192 return syntax; 193 } 194 195 } 196 | Popular Tags |