- Timestamp:
- 10/27/13 20:17:17 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.Problems.GPDL/CodeGenerator/BruteForceCodeGen.cs
r10080 r10086 81 81 nextAlternative = (nextAlternative + 1) % subTrees.Length; 82 82 } while (subTrees[nextAlternative] != null && subTrees[nextAlternative].Done); 83 84 // from the nodes which are not done take the first with minimum count85 //nextAlternative = (from i in Enumerable.Range(0, subTrees.Length)86 // where subTrees[i] == null || !subTrees[i].Done87 // orderby subTrees[i]==null?0:subTrees[i].Count ascending88 // select i).FirstOrDefault(); // possibly there are no children left that can be tried89 83 } else { 90 84 // for sequenceNodes update all sub-trees … … 177 171 178 172 private AttributedGrammar CreateGrammarFromAst(GPDefNode ast) { 173 174 var nonTerminals = ast.NonTerminals.Select(t => new Symbol(t.Ident, GetSymbolAttributes(t.FormalParameters))).ToArray(); 175 var terminals = ast.Terminals.Select(t => new Symbol(t.Ident, GetSymbolAttributes(t.FormalParameters))).ToArray(); 179 176 string startSymbolName = ast.Rules.First().NtSymbol; 180 var startSymbolNode = ast.NonTerminals.Single(nt => nt.Ident == startSymbolName); 177 181 178 // create startSymbol 182 var g = new AttributedGrammar(new Symbol(startSymbolName, ParseSymbolAttributes(startSymbolNode.FormalParameters))); 179 var startSymbol = nonTerminals.Single(s => s.Name == startSymbolName); 180 var g = new AttributedGrammar(startSymbol, nonTerminals, terminals); 181 182 // add all production rules 183 183 foreach (var rule in ast.Rules) { 184 // create nt-symbol 185 var ntSymbolName = rule.NtSymbol; 186 var ntSymbolNode = ast.NonTerminals.Single(nt => nt.Ident == ntSymbolName); 187 var attributes = ParseSymbolAttributes(ntSymbolNode.FormalParameters); 188 var ntSymbol = new Symbol(ntSymbolName, attributes); 189 foreach (var alt in GetAlternatives(rule.Alternatives)) { 184 var ntSymbol = nonTerminals.Single(s => s.Name == rule.NtSymbol); 185 foreach (var alt in GetAlternatives(rule.Alternatives, nonTerminals.Concat(terminals))) { 190 186 g.AddProductionRule(ntSymbol, alt); 191 187 } … … 196 192 } 197 193 198 private IEnumerable<IAttribute> ParseSymbolAttributes(string formalParameters) {194 private IEnumerable<IAttribute> GetSymbolAttributes(string formalParameters) { 199 195 return (from fieldDef in Util.ExtractParameters(formalParameters) 200 196 select new Attribute(fieldDef.Identifier, fieldDef.Type, AttributeType.Parse(fieldDef.RefOrOut))). … … 202 198 } 203 199 204 private IEnumerable<Sequence> GetAlternatives(AlternativesNode altNode ) {200 private IEnumerable<Sequence> GetAlternatives(AlternativesNode altNode, IEnumerable<ISymbol> allSymbols) { 205 201 foreach (var alt in altNode.Alternatives) { 206 yield return GetSequence(alt.Sequence );207 } 208 } 209 210 private Sequence GetSequence(IEnumerable<RuleExprNode> sequence ) {202 yield return GetSequence(alt.Sequence, allSymbols); 203 } 204 } 205 206 private Sequence GetSequence(IEnumerable<RuleExprNode> sequence, IEnumerable<ISymbol> allSymbols) { 211 207 Debug.Assert(sequence.All(s => s is CallSymbolNode || s is RuleActionNode)); 212 208 var l = new List<ISymbol>(); … … 215 211 var actionNode = node as RuleActionNode; 216 212 if (callSymbolNode != null) { 217 l.Add(new Symbol(callSymbolNode.Ident, ParseSymbolAttributes(callSymbolNode.ActualParameter))); 213 Debug.Assert(allSymbols.Any(s => s.Name == callSymbolNode.Ident)); 214 // create a new symbol with actual parameters 215 l.Add(new Symbol(callSymbolNode.Ident, GetSymbolAttributes(callSymbolNode.ActualParameter))); 218 216 } else if (actionNode != null) { 219 217 l.Add(new SemanticSymbol("SEM", actionNode.SrcCode)); … … 313 311 314 312 // make sure we first descent into terminal alternatives -> we just order by number of non-terminals in the alternative 315 var altsWithSemActions = g.GetAlternativesWithSemanticActions(s).OrderBy(alt => alt.Count(symb => g.IsNonTerminal(symb))).ToArray(); 313 var altsWithSemActions = g.GetAlternativesWithSemanticActions(s) 314 .OrderBy(alt => alt.Count(symb => g.IsNonTerminal(symb))).ToArray(); 316 315 317 316 if (altsWithSemActions.Length > 1) {
Note: See TracChangeset
for help on using the changeset viewer.