
    g	                     Z    d dl Z d dlZd dlmZ d	dZd Zd ZdZd
dZe	dk(  r e        yy)    N)Nonterminalc                     |s| j                         }|t        j                         dz  dz
  }t        | |g|      }|rt	        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.
       )startsysgetrecursionlimit_generate_all	itertoolsislice)grammarr   depthniters        H/var/www/openai/venv/lib/python3.12/site-packages/nltk/parse/generate.pygenerater      sY     }&&(A-25'51Da(K    c              #      K   |r3	 t        | |d   |      D ]  }t        | |dd  |      D ]	  }||z       y g  y # t        $ r}t        d      |d }~ww xY ww)Nr      z}The grammar has rule(s) that yield infinite recursion!
Eventually use a lower 'depth', or a higher 'sys.setrecursionlimit()'.)_generate_oner	   RecursionErrorRuntimeError)r   itemsr   frag1frag2errors         r   r	   r	   )   sz     		&wa%@*7E!"IuEE%-' F A   	H 	s%   A1= A	AAAAc              #      K   |dkD  rTt        |t              r>| j                  |      D ](  }t        | |j	                         |dz
        E d {    * y |g y y 7 w)Nr   )lhsr   )
isinstancer   productionsr	   rhs)r   itemr   prods       r   r   r   9   s_     qydK(+++5($((*eaiHHH 6 &L  Is   AAAA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                     ddl m} t        d| fz         t        t               |j	                  t              }t        t        ||       d      D ]$  \  }}t        d|dj                  |      fz         & y )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   sents        r   demor.   M   sa     	
?1$
FG	,nn\*GXg3Q74i1chhtn--. 8r   __main__)NNN)   )
r
   r   r&   r   r   r	   r   r(   r.   __name__ r   r   <module>r3      s?     
 $0 / zF r   