Changeset 418
- Timestamp:
- Jun 9, 2010 12:14:27 PM (14 years ago)
- Location:
- trunk/MagnoliaPlugin/src/org/magnolialang/parsetree
- Files:
-
- 1 added
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/MagnoliaPlugin/src/org/magnolialang/parsetree/XaTreeFactory.java
r411 r418 1 1 package org.magnolialang.parsetree; 2 2 3 import java.util.Random; 4 3 5 import org.eclipse.imp.pdb.facts.IConstructor; 6 import org.eclipse.imp.pdb.facts.IInteger; 4 7 import org.eclipse.imp.pdb.facts.IList; 8 import org.eclipse.imp.pdb.facts.IListWriter; 9 import org.eclipse.imp.pdb.facts.IMap; 10 import org.eclipse.imp.pdb.facts.IMapWriter; 11 import org.eclipse.imp.pdb.facts.ITuple; 5 12 import org.eclipse.imp.pdb.facts.IValue; 6 13 import org.eclipse.imp.pdb.facts.IValueFactory; … … 11 18 12 19 public class XaTreeFactory { 20 private static final int RANDOM_CHANCE_CONS = 35; 21 private static final int RANDOM_CHANCE_SEQ = 45; 22 private static final int RANDOM_CHANCE_LEAF = 100; 23 private static final int RANDOM_MAX_CHILDREN = 5; 13 24 public static TypeStore ts = new TypeStore( 14 25 org.rascalmpl.values.uptr.Factory.getStore(), … … 89 100 return vf.constructor(Type_Child, vf.integer(index)); 90 101 } 102 103 public static IConstructor randomTree(Random random) { 104 return (IConstructor) randomTreeWithVars(random, 0, new UniqueGen("x"), 100, 1000); 105 } 106 107 public static ITuple randomTreeWithVars(Random random, int varChance) { 108 return randomTreeWithVars(random, varChance, new UniqueGen("x"), 100, 5000); 109 } 110 111 private static ITuple randomTreeWithVars(Random random, int varChance, UniqueGen gen, int maxDepth, int maxSize) { 112 113 IConstructor tree, varTree; 114 IMap env; 115 int r = (int) (random.nextInt(100)*((150.0-maxDepth)/100.0)); 116 int size = 1; 117 IConstructor var = null; 118 119 if(random.nextInt(100) < varChance) { 120 var = termvar(gen.next(), "foo"); 121 varChance = 0; 122 } 123 124 if(r < RANDOM_CHANCE_SEQ && maxDepth > 0) { 125 126 //int num = (int) (RANDOM_MAX_CHILDREN*Math.pow(Math.abs(random.nextGaussian()), 2)); 127 //System.out.println(num); 128 IListWriter lw1 = vf.listWriter(Type_XaTree); 129 IListWriter lw2 = vf.listWriter(Type_XaTree); 130 IMapWriter envw = vf.mapWriter(Type_TermVar, Type_XaTree); 131 while(random.nextDouble() < 0.6 && maxSize > 0) { 132 ITuple child = randomTreeWithVars(random, varChance, gen, maxDepth-1, maxSize-1); 133 maxSize -= ((IInteger)child.get(3)).intValue(); 134 size += ((IInteger)child.get(3)).intValue(); 135 lw1.append(child.get(0)); 136 lw2.append(child.get(1)); 137 envw.putAll((IMap) child.get(2)); 138 } 139 140 env = envw.done(); 141 if(r < RANDOM_CHANCE_CONS) { 142 tree = cons("foo", "foo", lw1.done()); 143 varTree = cons("foo", "foo", lw2.done()); 144 } 145 else { 146 tree = seq("foo", lw1.done()); 147 varTree = seq("foo", lw2.done()); 148 } 149 } 150 else { // if(r < RANDOM_CHANCE_LEAF) { 151 int num = random.nextInt(RANDOM_MAX_CHILDREN) + 1; 152 StringBuffer s = new StringBuffer(num); 153 for(int i = 0; i < num; i++) 154 s.append((char)(random.nextInt('Z'-'A')+'A' + (random.nextBoolean() ? 0 : 'a'-'A'))); 155 tree = leaf(s.toString(), "foo"); 156 varTree = leaf(s.toString(), "foo"); 157 env = vf.map(Type_TermVar, Type_XaTree); 158 maxSize--; 159 } 160 161 if(var != null) { 162 env = env.put(var, varTree); 163 varTree = var; 164 } 165 return vf.tuple(tree, varTree, env, vf.integer(size)); 166 } 167 168 91 169 } 170 class UniqueGen { 171 String name; 172 int counter; 173 174 public UniqueGen(String name) { 175 this.name = name; 176 this.counter = 0; 177 } 178 179 String next() { 180 return name + counter++; 181 } 182 }
Note:
See TracChangeset
for help on using the changeset viewer.