import re import sys import random class ContextFree(object): def __init__(self): self.rules = dict() self.expansion = list() def add_rule(self, rule, expansion): if rule in self.rules: self.rules[rule].append(expansion) else: self.rules[rule] = [expansion] def expand(self, start): from random import choice if start in self.rules: possible_expansions = self.rules[start] random_expansion = choice(possible_expansions) for elem in random_expansion: self.expand(elem) else: self.expansion.append(start) def get_expansion(self, axiom): self.expand(axiom) return self.expansion def reset(self): self.expansion = list() import random import time #don't pick the same thing twice, #pick the same thing consistently if __name__ == '__main__': cfree = ContextFree() cfree.add_rule('Intro' , ['AV', 'in','adj2','color1','contNouns' ,',']); cfree.add_rule('theU' , ['the universe']); cfree.add_rule('theU' , ['totality']); cfree.add_rule('V' , ['floats']); cfree.add_rule('V' , ['drifts']); cfree.add_rule('V' , ['errs']); cfree.add_rule('V' , ['roams']); cfree.add_rule('V' , ['wanders']); cfree.add_rule('V' , ['meanders']); cfree.add_rule('AV' , ['immersed']); cfree.add_rule('AV' , ['with']); cfree.add_rule('AV' , ['sumerged']); cfree.add_rule('AV' , ['surrounded']); cfree.add_rule('AV' , ['ringed']); cfree.add_rule('AV' , ['bound']); cfree.add_rule('AV' , ['enclosed']); cfree.add_rule('adj2' , ['a vast']); cfree.add_rule('adj2' , ['an insurmountable']); cfree.add_rule('adj2' , ['a boundless']); cfree.add_rule('adj2' , ['a giant']); cfree.add_rule('adj2' , ['an unfathomable']); cfree.add_rule('color1' , ['auburn']); cfree.add_rule('color1' , ['silver']); cfree.add_rule('color1' , ['burgundy']); cfree.add_rule('color1' , ['vermillion']); cfree.add_rule('color1' , ['umber']); cfree.add_rule('color1' , ['ultramarine']); cfree.add_rule('color1' , ['ochre']); cfree.add_rule('contNouns' , ['abyss']); cfree.add_rule('contNouns' , ['crevasse']); cfree.add_rule('contNouns' , ['void']); cfree.add_rule('contNouns' , ['hollow']); cfree.add_rule('contNouns' , ['nothingness']) cfree.add_rule('contNouns' , ['hole']) cfree.add_rule('contNouns' , ['nothingness']) cfree.add_rule('contNouns' , ['depth']) cfree.add_rule('contNouns' , ['gorge']) cfree.add_rule('contNouns' , ['interval']) cfree.add_rule('contNouns' , ['chasm']) cfree.add_rule('contNouns' , ['desert']) cfree.add_rule('contNouns' , ['canyon']) cfree.add_rule('contNouns' , ['ravine']) cfree.add_rule('contNouns' , ['cave']) cfree.add_rule('contNouns' , ['well']) cfree.add_rule('1Beast' , ['which','V', 'AVu', 'on','bN','of','AdjM' , 'color', 'aaa',',']); cfree.add_rule('AVu' , ['hazardly' ]); cfree.add_rule('AVu' , ['perilously' ]); cfree.add_rule('AVu' , ['carelessly' ]); cfree.add_rule('AVu' , ['recklessly' ]); cfree.add_rule('bN' , ['the back' ]); cfree.add_rule('bN' , ['the crown' ]); cfree.add_rule('bN' , ['a single hair' ]); cfree.add_rule('bN' , ['the tip of the tail' ]); cfree.add_rule('bN' , ['the breath' ]); cfree.add_rule('bN' , ['the brow' ]); cfree.add_rule('AdjM' , ['an immense' ]); cfree.add_rule('AdjM' , ['a great' ]); cfree.add_rule('AdjM' , ['a collosal' ]); cfree.add_rule('AdjM' , ['a prodigious' ]); cfree.add_rule('AdjM' , ['a gargatuan' ]); cfree.add_rule('AdjM' , ['a pondering' ]); cfree.add_rule('AdjM' , ['a vast' ]); cfree.add_rule('AdjM' , ['a boudless' ]); cfree.add_rule('AdjM' , ['a farflung' ]); cfree.add_rule('AdjM' , ['a limitless' ]); cfree.add_rule('AdjM' , ['a boundless' ]); cfree.add_rule('color' , ['whiter than white' ]); cfree.add_rule('color' , ['flesh colored' ]); cfree.add_rule('color' , ['darker than night' ]); cfree.add_rule('color' , ['burning red' ]); cfree.add_rule('color' , ['imperceptibly neutral grey' ]); cfree.add_rule('color' , ['sun streaked' ]); cfree.add_rule('1Place' , ['whose','bAD', 'ubN', 'are','bvN','sV','loc','of','tens' , 'oldAdj', 'landN',',']); cfree.add_rule('bAD' , ['scaley' ]); cfree.add_rule('bAD' , ['dry and gnarled' ]); cfree.add_rule('bAD' , ['bony' ]); cfree.add_rule('bAD' , ['crooked' ]); cfree.add_rule('bAD' , ['deformed and leathery' ]); cfree.add_rule('bAD' , ['knotted and knurled' ]); cfree.add_rule('ubN' , ['feet' ]); cfree.add_rule('ubN' , ['appendages' ]); cfree.add_rule('ubN' , ['claws' ]); cfree.add_rule('bvN' , ['firmly' ]); cfree.add_rule('bvN' , ['steadfastly' ]); cfree.add_rule('bvN' , ['fastly' ]); cfree.add_rule('bvN' , ['unflinchingly' ]); cfree.add_rule('bvN' , ['tightly' ]); cfree.add_rule('sV' , ['clenching' ]); cfree.add_rule('sV' , ['fixed to' ]); cfree.add_rule('sV' , ['grasping' ]); cfree.add_rule('sV' , ['gripping' ]); cfree.add_rule('sV' , ['clasping' ]); cfree.add_rule('loc' , ['the tops' ]); cfree.add_rule('loc' , ['the sides' ]); cfree.add_rule('loc' , ['the peaks' ]); cfree.add_rule('loc' , ['the pinacles' ]); cfree.add_rule('loc' , ['the summits' ]); cfree.add_rule('loc' , ['the flanks' ]); cfree.add_rule('tens' , ['three' ]); cfree.add_rule('tens' , ['seven' ]); cfree.add_rule('tens' , ['nine' ]); cfree.add_rule('tens' , ['four' ]); cfree.add_rule('tens' , ['five' ]); cfree.add_rule('oldAdj' , ['cragy' ]); cfree.add_rule('oldAdj' , ['crumbling' ]); cfree.add_rule('oldAdj' , ['collapsing' ]); cfree.add_rule('oldAdj' , ['decomposing' ]); cfree.add_rule('oldAdj' , ['decaying' ]); cfree.add_rule('oldAdj' , ['fading' ]); cfree.add_rule('oldAdj' , ['corroding' ]); cfree.add_rule('oldAdj' , ['putrid' ]); cfree.add_rule('oldAdj' , ['wasting' ]); cfree.add_rule('landN' , ['mountains' ]); cfree.add_rule('landN' , ['peaks']); cfree.add_rule('landN' , ['cliffs' ]); cfree.add_rule('landN' , ['banks' ]); cfree.add_rule('landN' , ['bluffs' ]); cfree.add_rule('2Place' , ['that', 'rise', 'from', 'arid', 'plane' ,'of' ,'drifting' ,'fetid' ,'color' ,'dust',',']); cfree.add_rule('rise' , ['rise' ]); cfree.add_rule('rise' , ['emerge' ]); cfree.add_rule('rise' , ['appear' ]); cfree.add_rule('rise' , ['accend' ]); cfree.add_rule('rise' , ['surge' ]); cfree.add_rule('rise' , ['loom' ]); cfree.add_rule('arid' , ['an arid' ]); cfree.add_rule('arid' , ['a desolate' ]); cfree.add_rule('arid' , ['a bone dry' ]); cfree.add_rule('arid' , ['a barren' ]); cfree.add_rule('arid' , ['a bare and waste' ]); cfree.add_rule('arid' , ['a vapid' ]); cfree.add_rule('arid' , ['a fruitless' ]); cfree.add_rule('drifting' , ['drifting' ]); cfree.add_rule('drifting' , ['stagnant' ]); cfree.add_rule('drifting' , ['listless' ]); cfree.add_rule('drifting' , ['stale' ]); cfree.add_rule('drifting' , ['still' ]); cfree.add_rule('fetid' , ['fetid' ]); cfree.add_rule('fetid' , ['putrid' ]); cfree.add_rule('fetid' , ['rancid' ]); cfree.add_rule('fetid' , ['reeking' ]); cfree.add_rule('fetid' , ['rotting' ]); cfree.add_rule('fetid' , ['smoldering' ]); cfree.add_rule('dust' , ['dust' ]); cfree.add_rule('dust' , ['ash' ]); cfree.add_rule('dust' , ['cinders' ]); cfree.add_rule('dust' , ['grime' ]); cfree.add_rule('1Plant' , ['and the' ,'plane', 'is', 'balanced', 'precariously', 'on top of a', 'small', 'thin', 'color', 'treeN', 'tree',',']); cfree.add_rule('balanced' , ['balanced' ]); cfree.add_rule('balanced' , ['resting' ]); cfree.add_rule('precariously' , ['precariously' ]); cfree.add_rule('precariously' , ['tangentially' ]); cfree.add_rule('small' , ['small' ]); cfree.add_rule('small' , ['minuscule' ]); cfree.add_rule('thin' , ['thin' ]); cfree.add_rule('thin' , ['starved' ]); cfree.add_rule('thin' , ['fragile' ]); cfree.add_rule('thin' , ['emaciated' ]); cfree.add_rule('treeN' , ['acacia' ]); cfree.add_rule('treeN' , ['birch' ]); cfree.add_rule('treeN' , ['crab apple' ]); cfree.add_rule('treeN' , ['red bud' ]); cfree.add_rule('treeN' , ['myrtle' ]); cfree.add_rule('treeN' , ['dogwood' ]); cfree.add_rule('treeN' , ['magnolia' ]); cfree.add_rule('treeN' , ['hawthorne' ]); cfree.add_rule('treeN' , ['snow bell' ]); cfree.add_rule('2Beast' , ['that', 'grows', 'from', 'bN', 'of', 'adj2', "color" , 'ox',',']); cfree.add_rule('grows' , ['grows' ]); cfree.add_rule('grows' , ['emerges' ]); cfree.add_rule('color' , ['blood red' ]); cfree.add_rule('2BeastAttr' , ['with' ,'50Eyes', 'that', 'breathes' , 'flame' , 'theColorOfTheMidnightSky',',']); cfree.add_rule('50Eyes' , ['50 eyes' ]); cfree.add_rule('50Eyes' , ['48 heads' ]); cfree.add_rule('50Eyes' , ['19 hands' ]); cfree.add_rule('50Eyes' , ['60 mouths' ]); cfree.add_rule('breathes' , ['breath' ]); cfree.add_rule('breathes' , ['toss' ]); cfree.add_rule('breathes' , ['cast' ]); cfree.add_rule('breathes' , ['throw' ]); cfree.add_rule('breathes' , ['scatter' ]); cfree.add_rule('flame' , ['flame' ]); cfree.add_rule('flame' , ['lightning' ]); cfree.add_rule('flame' , ['winds' ]); cfree.add_rule('flame' , ['stars' ]); cfree.add_rule('flame' , ['comets' ]); cfree.add_rule('flame' , ['thunder' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of the Midnight sky' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of a summers day' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of a lover\'s memory' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of a autumn moon' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of a fogotten moment' ]); cfree.add_rule('theColorOfTheMidnightSky' , ['the color of a lost horizon' ]); cfree.add_rule('1tinyThing' , ['the', 'ox', '\'s hooves', 'are', 'standing' ,'onTopOfASingle', 'grainOfSand',',']); cfree.add_rule('standing' , ['standing']); cfree.add_rule('standing' , ['balancing' ]); cfree.add_rule('standing' , ['resting' ]); cfree.add_rule('standing' , ['poised' ]); cfree.add_rule('standing' , ['settled' ]); cfree.add_rule('onTopOfASingle' , ['on top of a single' ]); cfree.add_rule('grainOfSand' , ['gram of ore' ]); cfree.add_rule('grainOfSand' , ['gram of malachite' ]); cfree.add_rule('grainOfSand' , ['gram of magnesum' ]); cfree.add_rule('grainOfSand' , ['gram of sulfur' ]); cfree.add_rule('grainOfSand' , ['gram of lead' ]); cfree.add_rule('grainOfSand' , ['gram of gold' ]); cfree.add_rule('inLike' , ['whichFloats', 'inTheEye', 'of the' ,'aaa', ',' , 'like', 'aMoteOfDust',',']); aaa= random.sample(['tortuga', 'whale', 'elephant', 'mamoth', 'giant squid', 'jelly fish' ], 1); ox= random.sample(["ox", "bull", "goat", "stag","boar","raven"], 1); plane= random.sample(["plain", "plane", "expanse", "breadth","span","sweep","field"], 1); cfree.add_rule('whichFloats' , ['which floats' ]); cfree.add_rule('whichFloats' , ['which lies' ]); cfree.add_rule('whichFloats' , ['which ebbs' ]); cfree.add_rule('whichFloats' , ['which hovers' ]); cfree.add_rule('whichFloats' , ['which lingers' ]); cfree.add_rule('whichFloats' , ['which wafts' ]); cfree.add_rule('whichFloats' , ['which is adrift' ]); cfree.add_rule('inTheEye' , ['in the eye' ]); cfree.add_rule('inTheEye' , ['in the mind' ]); cfree.add_rule('inTheEye' , ['in the dreams' ]); cfree.add_rule('inTheEye' , ['in the memories']); cfree.add_rule('inTheEye' , ['in the thoughts']); cfree.add_rule('inTheEye' , ['in the forgotten thoughts']); cfree.add_rule('inTheEye' , ['in the hopes']); cfree.add_rule('aMoteOfDust' , ['a mote of dust' ]); cfree.add_rule('aMoteOfDust' , ['a fleck of sand' ]); cfree.add_rule('aMoteOfDust' , ['a seed in the sky' ]); cfree.add_rule('aMoteOfDust' , ['a fact in the mind' ]); cfree.add_rule('noOne' , ['noOneHasEverSeen', 'aaa',',']); cfree.add_rule('noOneHasEverSeen' , ['the pen cannot describe the' ]); cfree.add_rule('noOneHasEverSeen' , ['a tale cannot tell the' ]); cfree.add_rule('noOneHasEverSeen' , ['no image can represent the' ]); cfree.add_rule('noOneHasEverSeen' , ['no words can express the' ]); cfree.add_rule('noOneHasEverSeen' , ['no poem can relatethe ' ]); cfree.add_rule('noOneHasEverSeen' , ['no voice can ever sing of the' ]); cfree.add_rule('allWeKnow' , ['all we know is that the', 'lonely' ]); cfree.add_rule('lonely' , ['forlorn' ]); cfree.add_rule('lonely' , ['singular' ]); cfree.add_rule('lonely' , ['companionless' ]); cfree.add_rule('lonely' , ['forsaken' ]); cfree.add_rule('lonely' , ['solitary' ]); cfree.add_rule('lonely' , ['forgotten' ]); cfree.add_rule('endlessly' , ['endlessly' ]); cfree.add_rule('endlessly' , ['forever' ]); cfree.add_rule('endlessly' , ['perpetualy' ]); cfree.add_rule('endlessly' , ['for all time' ]); cfree.add_rule('endlessly' , ['eternally' ]); cfree.add_rule('endlessly' , ['continuously' ]); cfree.add_rule('withEverything' , ['aaa','floats', 'endlessly', 'in all time and all space with all of us, and everything']); expansion1 = cfree.get_expansion('Intro') expansion2 = cfree.get_expansion('1Beast') expansion3 = cfree.get_expansion('1Place') expansion4 = cfree.get_expansion('2Place') expansion5 = cfree.get_expansion('1Plant') expansion6 = cfree.get_expansion('2Beast') expansion7 = cfree.get_expansion('2BeastAttr') expansion8 = cfree.get_expansion('1tinyThing') expansion9 = cfree.get_expansion('inLike') expansion10 = cfree.get_expansion('noOne') expansion11 = cfree.get_expansion('allWeKnow') expansion12 = cfree.get_expansion('withEverything') b=[' '.join(expansion1)] str_aaa = str(aaa)[2 : -2] str_ox = str(ox)[2 : -2] str_plane = str(plane)[2 : -2] for words in b: words.strip() words = re.sub('aaa', str_aaa, words) words = re.sub('ox', str_ox, words) words = re.sub('plane', str_plane, words) words = re.sub(' ,', ",", words) words = re.sub(' \'s', "\'s", words) words = re.sub('with in', "within", words) print words cfree.reset()