pub struct GrammarBuilder { /* private fields */ }Expand description
Helper class to build a BNF grammar.
Equivalent to xgrammar’s GrammarBuilder. Holds the in-progress
rule list and CSR expression store, plus a name→id index.
Implementations§
Source§impl GrammarBuilder
impl GrammarBuilder
Sourcepub fn add_rule(&mut self, rule: Rule) -> Result<i32, BuilderError>
pub fn add_rule(&mut self, rule: Rule) -> Result<i32, BuilderError>
Add a fully-formed rule and return its id.
Returns Err if a rule of the same name already exists.
Sourcepub fn add_rule_named(
&mut self,
name: impl Into<String>,
body_expr_id: i32,
) -> Result<i32, BuilderError>
pub fn add_rule_named( &mut self, name: impl Into<String>, body_expr_id: i32, ) -> Result<i32, BuilderError>
Add a rule with the given name and body_expr_id.
Sourcepub fn add_rule_with_hint(
&mut self,
name_hint: &str,
body_expr_id: i32,
) -> Result<i32, BuilderError>
pub fn add_rule_with_hint( &mut self, name_hint: &str, body_expr_id: i32, ) -> Result<i32, BuilderError>
Add a rule with a body, deriving a unique name from name_hint.
Sourcepub fn add_empty_rule(
&mut self,
name: impl Into<String>,
) -> Result<i32, BuilderError>
pub fn add_empty_rule( &mut self, name: impl Into<String>, ) -> Result<i32, BuilderError>
Add a body-less rule (body_expr_id = -1). The body must be set
later with GrammarBuilder::update_rule_body. Useful when the
rule id is needed to build the body (recursive rules).
Sourcepub fn add_empty_rule_with_hint(
&mut self,
name_hint: &str,
) -> Result<i32, BuilderError>
pub fn add_empty_rule_with_hint( &mut self, name_hint: &str, ) -> Result<i32, BuilderError>
Add a body-less rule with a unique name derived from name_hint.
Sourcepub fn update_rule_body(
&mut self,
rule_id: i32,
body_expr_id: i32,
) -> Result<(), BuilderError>
pub fn update_rule_body( &mut self, rule_id: i32, body_expr_id: i32, ) -> Result<(), BuilderError>
Set the body of rule rule_id.
Returns Err if rule_id is out of range.
Sourcepub fn update_rule_body_named(
&mut self,
rule_name: &str,
body_expr_id: i32,
) -> Result<(), BuilderError>
pub fn update_rule_body_named( &mut self, rule_name: &str, body_expr_id: i32, ) -> Result<(), BuilderError>
Set the body of the rule named rule_name.
Sourcepub fn update_lookahead_assertion(
&mut self,
rule_id: i32,
lookahead_assertion_id: i32,
) -> Result<(), BuilderError>
pub fn update_lookahead_assertion( &mut self, rule_id: i32, lookahead_assertion_id: i32, ) -> Result<(), BuilderError>
Set the lookahead-assertion expr id of rule rule_id. An id of
-1 means no assertion.
Sourcepub fn update_lookahead_assertion_named(
&mut self,
rule_name: &str,
lookahead_assertion_id: i32,
) -> Result<(), BuilderError>
pub fn update_lookahead_assertion_named( &mut self, rule_name: &str, lookahead_assertion_id: i32, ) -> Result<(), BuilderError>
Set the lookahead-assertion expr id of the rule named rule_name.
Sourcepub fn update_lookahead_exact(
&mut self,
rule_id: i32,
is_exact: bool,
) -> Result<(), BuilderError>
pub fn update_lookahead_exact( &mut self, rule_id: i32, is_exact: bool, ) -> Result<(), BuilderError>
Mark the lookahead assertion of rule rule_id as exact.
Sourcepub fn get_new_rule_name(&self, name_hint: &str) -> String
pub fn get_new_rule_name(&self, name_hint: &str) -> String
Find an unused rule name starting from name_hint, appending an
integer suffix (_1, _2, …) on collision.
The first probed suffix is read from next_cnt_per_hint (a cache
of the last suffix reached for this hint) rather than restarting
from 1 every call. This makes repeated calls with the same hint
amortized O(1) instead of O(N) — see the field doc on
GrammarBuilder. Behavior is unchanged: every candidate is
still verified absent from rule_name_to_id, and the cache only
advances (never skips a still-free lower suffix, because suffixes
for a given hint are only ever consumed in increasing order).
Sourcepub fn get_rule_id(&self, name: &str) -> i32
pub fn get_rule_id(&self, name: &str) -> i32
Rule id of the rule named name, or -1 if absent.
Source§impl GrammarBuilder
impl GrammarBuilder
Sourcepub fn get(self, root_rule_name: &str) -> Result<GrammarData, BuilderError>
pub fn get(self, root_rule_name: &str) -> Result<GrammarData, BuilderError>
Finish building and return the GrammarData, setting the root
rule to the rule with root_rule_name.
Returns Err if the named rule is not present.
Sourcepub fn get_by_id(self, root_rule_id: i32) -> Result<GrammarData, BuilderError>
pub fn get_by_id(self, root_rule_id: i32) -> Result<GrammarData, BuilderError>
Finish building and return the GrammarData, setting the root
rule to root_rule_id.
Returns Err if root_rule_id is out of bounds.
Sourcepub fn add_grammar_expr(&mut self, kind: GrammarExprType, data: &[i32]) -> i32
pub fn add_grammar_expr(&mut self, kind: GrammarExprType, data: &[i32]) -> i32
Append a raw (type, data[]) expression to the CSR store and
return its expr id.
Sourcepub fn add_byte_string_bytes(&mut self, bytes: &[i32]) -> i32
pub fn add_byte_string_bytes(&mut self, bytes: &[i32]) -> i32
Add a ByteString expr from raw bytes (each 0..=255).
Sourcepub fn add_byte_string(&mut self, s: &str) -> i32
pub fn add_byte_string(&mut self, s: &str) -> i32
Add a ByteString expr from a Rust string (UTF-8 bytes).
Sourcepub fn add_character_class(
&mut self,
elements: &[CharacterClassElement],
is_negative: bool,
) -> i32
pub fn add_character_class( &mut self, elements: &[CharacterClassElement], is_negative: bool, ) -> i32
Add a CharacterClass expr, e.g. [a-z] / [^a-z].
Sourcepub fn add_character_class_star(
&mut self,
elements: &[CharacterClassElement],
is_negative: bool,
) -> i32
pub fn add_character_class_star( &mut self, elements: &[CharacterClassElement], is_negative: bool, ) -> i32
Add a CharacterClassStar expr, e.g. [a-z]*.
Sourcepub fn add_empty_str(&mut self) -> i32
pub fn add_empty_str(&mut self) -> i32
Add an EmptyStr expr (the empty string "").
Sourcepub fn add_rule_ref(&mut self, rule_id: i32) -> i32
pub fn add_rule_ref(&mut self, rule_id: i32) -> i32
Add a RuleRef expr pointing at rule_id.
Sourcepub fn add_sequence(&mut self, elements: &[i32]) -> i32
pub fn add_sequence(&mut self, elements: &[i32]) -> i32
Add a Sequence expr (concatenation of sub-expr ids).
Sourcepub fn add_choices(&mut self, choices: &[i32]) -> i32
pub fn add_choices(&mut self, choices: &[i32]) -> i32
Add a Choices expr (alternation of sub-expr ids).
Sourcepub fn add_repeat(
&mut self,
ref_rule_id: i32,
min_repeat: i32,
max_repeat: i32,
) -> i32
pub fn add_repeat( &mut self, ref_rule_id: i32, min_repeat: i32, max_repeat: i32, ) -> i32
Add a Repeat expr [rule_id, min, max].
Sourcepub fn add_tag_dispatch(&mut self, spec: &TagDispatchSpec) -> i32
pub fn add_tag_dispatch(&mut self, spec: &TagDispatchSpec) -> i32
Add a TagDispatch expr. Tag strings and stop/exclude string
lists are interned as ByteString/Choices sub-exprs first,
matching the CSR layout decoded by GrammarData::tag_dispatch.
Sourcepub fn num_grammar_exprs(&self) -> i32
pub fn num_grammar_exprs(&self) -> i32
Number of expressions stored so far.
Sourcepub fn get_grammar_expr(&self, expr_id: i32) -> GrammarExpr<'_>
pub fn get_grammar_expr(&self, expr_id: i32) -> GrammarExpr<'_>
Borrowed view of expr expr_id. Panics if out of bounds — the
builder is internal and ids it returns are always valid.
Trait Implementations§
Source§impl Debug for GrammarBuilder
impl Debug for GrammarBuilder
Source§impl Default for GrammarBuilder
impl Default for GrammarBuilder
Source§fn default() -> GrammarBuilder
fn default() -> GrammarBuilder
Auto Trait Implementations§
impl !Freeze for GrammarBuilder
impl !RefUnwindSafe for GrammarBuilder
impl Send for GrammarBuilder
impl !Sync for GrammarBuilder
impl Unpin for GrammarBuilder
impl UnwindSafe for GrammarBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.