diff --git a/guidance/_grammar.py b/guidance/_grammar.py index 4f0490ac5..85a94b227 100644 --- a/guidance/_grammar.py +++ b/guidance/_grammar.py @@ -177,6 +177,8 @@ def match( try: parser.consume_bytes(byte_string) + if not allow_partial: + parser.force_done() except _parser.ByteParserException: if raise_exceptions: raise diff --git a/tests/unit/test_grammar.py b/tests/unit/test_grammar.py index 81f633dbe..40dc336be 100644 --- a/tests/unit/test_grammar.py +++ b/tests/unit/test_grammar.py @@ -1,6 +1,7 @@ import pytest import guidance from guidance import gen, models, optional, select, string +from guidance._parser import ByteParserException def test_select_reset_pos(): @@ -132,4 +133,12 @@ def test_partial_match(self, string): match = g.match(f"123{string}", allow_partial=True) assert match is not None assert match.partial - assert match.captures["mycap"] == string \ No newline at end of file + assert match.captures["mycap"] == string + + def test_raises_on_incomplete_input(self): + g = "123" + gen(regex=r"\d+x?", name="mycap") + # Ok since we allow partial + assert g.match(b"123", raise_exceptions=True, allow_partial=True) is not None + # Shold raise since we don't allow partial + with pytest.raises(ByteParserException): + g.match(b"123", raise_exceptions=True)