3
dM	                 @   sV   d dl Z d dlZd dlmZ dddZdd Zdd Zd	ZdddZe	dkrRe  dS )    N)Nonterminalc             C   s<   |s| j  }|dkrtj}t| |g|}|r8tj||}|S )am  
    Generates an iterator of all sentences from a CFG.

    :param grammar: The Grammar used to generate sentences.
    :param start: The Nonterminal from which to start generate sentences.
    :param depth: The maximal depth of the generated tree.
    :param n: The maximum number of sentences to return.
    :return: An iterator of lists of terminal tokens.
    N)startsysmaxsize_generate_all	itertoolsislice)grammarr   depthniter r   3/tmp/pip-build-v9q4h5k9/nltk/nltk/parse/generate.pygenerate   s    
r   c             c   s   |rzyFx@t | |d |D ],}x&t| |dd  |D ]}|| V  q2W qW W q tk
rv } ztd|W Y d d }~X qX ng V  d S )Nr      z6The grammar has rule(s) that yield infinite recursion!)_generate_oner   RecursionErrorRuntimeError)r	   itemsr
   Zfrag1Zfrag2errorr   r   r   r   '   s    r   c             c   sP   |dkrLt |trDx8| j|dD ]}t| |j |d E d H  q W n|gV  d S )Nr   )lhsr   )
isinstancer   Zproductionsr   rhs)r	   itemr
   prodr   r   r   r   6   s
    
 r   z
  S -> NP VP
  NP -> Det N
  PP -> P NP
  VP -> 'slept' | 'saw' NP | 'walked' PP
  Det -> 'the' | 'a'
  N -> 'man' | 'park' | 'dog'
  P -> 'in' | 'with'
   c             C   sf   ddl m} td| f  tt |jt}x4tt|| ddD ]\}}td|dj|f  q@W d S )Nr   )CFGz3Generating the first %d sentences for demo grammar:)r   r   z%3d. %s )nltk.grammarr   printdemo_grammar
fromstring	enumerater   join)Nr   r	   r   sentr   r   r   demoJ   s    
r&   __main__)NNN)r   )
r   r   r   r   r   r   r   r    r&   __name__r   r   r   r   <module>
   s   


