o
    rZh	                     @   sZ   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r+e  dS dS )    N)Nonterminalc                 C   sF   |s|   }|du rt d d }t| |g|}|r!t||}|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getrecursionlimit_generate_all	itertoolsislice)grammarr   depthniter r   B/var/www/auris/lib/python3.10/site-packages/nltk/parse/generate.pygenerate   s   
r   c              
   c   st    |r5z t | |d |D ]}t| |dd  |D ]}|| V  qqW d S  ty4 } ztd|d }~ww g V  d S )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   Zfrag1Zfrag2errorr   r   r   r   )   s"   
r   c                 c   sT    |dkr(t |tr"| j|dD ]}t| | |d E d H  qd S |gV  d S d S )Nr   )lhsr   )
isinstancer   Zproductionsr   rhs)r
   itemr   prodr   r   r   r   9   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   sb   ddl m} td| f  tt |t}tt|| ddD ]\}}td|d|f  qd S )Nr   )CFGz3Generating the first %d sentences for demo grammar:)r   r   z%3d. %s )nltk.grammarr   printdemo_grammarZ
fromstring	enumerater   join)Nr   r
   r   sentr   r   r   demoM   s   
r&   __main__)NNN)r   )
r   r   r   r   r   r   r   r!   r&   __name__r   r   r   r   <module>   s   

	


