Skip to content

Instantly share code, notes, and snippets.

@marklit
Last active August 29, 2015 14:10
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marklit/8744053c62e0ee55ba0a to your computer and use it in GitHub Desktop.
Save marklit/8744053c62e0ee55ba0a to your computer and use it in GitHub Desktop.
Generate English Sentences
from itertools import chain, product
from re import match, findall
GRAMMAR = '''
<sentence> ::= <noun phrase=""> <verb phrase="">
<noun> ::= "boy " | "troll " | "moon " | "telescope "
<transitive verb=""> ::= "hits " | "sees "
<intransitive verb=""> ::= "runs " | "sleeps "
<adjective> ::= "big " | "red "
<adverb> ::= "quickly " | "quietly "
<determiner> ::= "a " | "that " | "each " | "every "
<pronoun> ::= "he " | "she " | "it "
<noun phrase=""> ::= <determiner> <noun> | <determiner> <adjective> <noun>
<verb phrase=""> ::= <intransitive verb=""> | <transitive verb=""> <noun phrase="">
'''
def parse(g):
return dict([(w.strip(), [findall(r'(<.+?>|".+?")', s)
for s in m.split('|')])
for w, m in [d.split('::=')
for d in g.strip().splitlines()]])
def generate(term):
return findall(r'"(.*?)"', term) if match('".*', term) else \
chain(*[map(''.join, product(*map(generate, p)))
for p in syntax[term]])
if __name__ == "__main__":
syntax = parse(GRAMMAR)
print list(generate('<sentence>'))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment