1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
class Random:
def __init__(self, seed):
self.sevenFive = 16807
self.twoThirtyone = 2147483647
self.newNum = seed
def next(self):
self.newNum = self.sevenFive*self.newNum % self.twoThirtyone
return self.newNum
def choose(self, limit):
return self.next()%limit
class Rule:
def __init__(self, left, right):
self.left = left
self.right = right
self.count = 1
def __repr__(self):
string = str(self.count)
string += " "
string += str(self.left)
string += " -> "
for n in range (0, len(self.right)):
string += self.right[n]
string += " "
return string
class Grammar:
def __init__(self, seed):
self.r = Random(seed)
self.dictionary = {}
def rule(self, left, right):
if left not in self.dictionary:
self.dictionary[left] = (Rule(left,right),)
else:
self.dictionary[left] += (Rule(left, right),)
def generate(self):
if 'Start' in self.dictionary:
return self.generating(('Start',))
else:
raise RuntimeError
def select(self, left):
rules = self.dictionary[left]
total = 0
c = 0
#Some of the loops are probably not needed
for m in range (0, len(rules)):
total += rules[m].count
index = self.r.choose(total)
for c in range (0, len(rules)):
index -= rules[c].count
if index <= 0:
break
chosen = rules[c]
for n in range (0, len(rules)):
if rules[n] is not chosen:
rules[n].count += 1
return chosen.right
def generating(self,strings):
result=''
for n in range (0, len(strings)):
if strings[n] not in self.dictionary:
result += strings[n]
result += " "
else:
result += self.generating(self.select(strings[n]))
return result
G = Grammar(101)
G.rule('Noun', ('cat',)) # 01
G.rule('Noun', ('boy',)) # 02
G.rule('Noun', ('dog',)) # 03
G.rule('Noun', ('girl',)) # 04
G.rule('Verb', ('bit',)) # 05
G.rule('Verb', ('chased',)) # 06
G.rule('Verb', ('kissed',)) # 07
G.rule('Phrase', ('the', 'Noun', 'Verb', 'the', 'Noun')) # 08
G.rule('Story', ('Phrase',)) # 09
G.rule('Story', ('Phrase', 'and', 'Story')) # 10
G.rule('Story', ('Phrase', 'but', 'Story')) # 11
G.rule('Start', ('Story', '.')) # 12
for _ in range (0, 5):
print(G.generate())
# the cat bit the boy .
# the cat kissed the dog and the boy chased the boy .
# the cat chased the dog and the girl bit the boy but the girl chased the cat .
# the girl chased the dog .
# the boy kissed the girl and the cat kissed the girl .
print()
print()
#
#
J = Grammar(1453)
J.rule('Noun', ('sentence',))
J.rule('Noun', ('walrus',))
J.rule('Noun', ('sky',))
J.rule('Noun', ('diamond',))
J.rule('Noun', ('Ottoman Empire',))
J.rule('Verb', ('is',))
J.rule('Verb', ('fanned',))
J.rule('Verb', ('generated',))
J.rule('Verb', ('hit',))
J.rule('Phrase', ('the', 'Noun', 'Verb', 'the', 'Noun')) # 08
J.rule('Phrase', ('Noun', 'Verb', 'the', 'Noun'))
J.rule('Story', ('Phrase',)) # 09
J.rule('Story', ('Phrase', 'and', 'Story')) # 10
J.rule('Story', ('Phrase', 'but', 'Story')) # 11
J.rule('Start', ('Story', '.')) # 12
for _ in range(0, 5):
print(J.generate())
# the walrus is the sentence and the diamond generated the walrus .
# the walrus generated the walrus and the walrus generated the sentence but diamond hit the sentence .
# sentence fanned the Ottoman Empire .
# the sky hit the diamond and sky is the sentence but the sky fanned the diamond .
# the walrus generated the diamond and the diamond generated the Ottoman Empire but the sky generated the sentence .
|