import java.util.Random; public class cfg { // str is the string being operated on. static String str; public static void main(String args[]) { // We start with the start string. str = "S"; int left = 1; // As long as rules doesn't return 0, we still have more non-terminals. while (left == 1) { left = rules(); } // Once we're done, print the result. System.out.println(str); } public static int rules() { Random randomizer = new Random(); int i, rndm; // We look for each of the non-terminals. When one is found, it is replaced. // The replacement rule is chosen randomly, with weights to make things interesting. i = str.indexOf("S"); if (i != -1) { rndm = randomizer.nextInt(9); if (rndm == 0) { str = ""; } else if (rndm <= 5) { str = str.substring(0,i) + "M" + str.substring(i+1); } else { str = str.substring(0,i) + "N" + str.substring(i+1); } return 1; } i = str.indexOf("M"); if (i != -1) { rndm = randomizer.nextInt(6); if (rndm == 0) { str = str.substring(0,i) + "AC" + str.substring(i+1); } else if (rndm <= 3) { str = str.substring(0,i) + "AO" + str.substring(i+1); } else { str = str.substring(0,i) + "N" + str.substring(i+1); } return 1; } i = str.indexOf("N"); if (i != -1) { rndm = randomizer.nextInt(3); if (rndm == 0) { str = str.substring(0,i) + "BC" + str.substring(i+1); } else { str = str.substring(0,i) + "BP" + str.substring(i+1); } return 1; } i = str.indexOf("O"); if (i != -1) { str = str.substring(0,i) + "MC" + str.substring(i+1); return 1; } i = str.indexOf("P"); if (i != -1) { str = str.substring(0,i) + "NC" + str.substring(i+1); return 1; } i = str.indexOf("A"); if (i != -1) { str = str.substring(0,i) + "a" + str.substring(i+1); return 1; } i = str.indexOf("B"); if (i != -1) { str = str.substring(0,i) + "b" + str.substring(i+1); return 1; } i = str.indexOf("C"); if (i != -1) { str = str.substring(0,i) + "c" + str.substring(i+1); return 1; } // If there are no more non-terminals, return 0. return 0; } }