@@ -180,10 +180,26 @@ def complete(self, word: UtteredWord | None = None) -> DAGTuple:
180180 dag .add_child (tup , edge )
181181 return tup
182182
183+ def get_state_with_n_best_tuples (self , n : int ) -> list [DAGTuple ]:
184+ """Return current tuple plus up to *n* further interpretations by stepping the parser."""
185+ if n < 0 :
186+ raise ValueError ("n must be non-negative" )
187+ dag = self .get_state ()
188+ dag .reset_to_first_tuple_after_last_word ()
189+ result : list [DAGTuple ] = [dag .get_current_tuple ()]
190+ try :
191+ for _ in range (n ):
192+ if not self .parse_goal (None ):
193+ break
194+ result .append (dag .get_current_tuple ())
195+ return result
196+ finally :
197+ dag .reset_to_first_tuple_after_last_word ()
198+
183199 def get_n_best_final_semantics (self , n : int ) -> list [TTRRecordType ]:
184- """Return up to *n* final semantics from complete leaf tuples ."""
200+ """Return final semantics from Java-style N-best tuple stepping ."""
185201 out : list [TTRRecordType ] = []
186- for tup in self .get_state (). get_n_best_final_tuples (n ):
202+ for tup in self .get_state_with_n_best_tuples (n ):
187203 sem = tup .get_semantics (self .context )
188204 ev = sem .evaluate ()
189205 if isinstance (ev , TTRRecordType ):
@@ -212,4 +228,5 @@ def parse_word(self, word: UtteredWord) -> WordLevelContextDAG | None:
212228DAGParser .completeTree = DAGParser .complete_tree # type: ignore[attr-defined]
213229DAGParser .getFinalSemantics = DAGParser .get_final_semantics # type: ignore[attr-defined]
214230DAGParser .newSentence = DAGParser .new_sentence # type: ignore[attr-defined]
231+ DAGParser .getStateWithNBestTuples = DAGParser .get_state_with_n_best_tuples # type: ignore[attr-defined]
215232DAGParser .getNBestFinalSemantics = DAGParser .get_n_best_final_semantics # type: ignore[attr-defined]
0 commit comments