diff options
author | JSDurand <mmemmew@gmail.com> | 2023-02-27 12:36:41 +0800 |
---|---|---|
committer | JSDurand <mmemmew@gmail.com> | 2023-02-27 12:36:41 +0800 |
commit | fbaa420ed550e9c3e7cdc09d4a8ec22bfbd782a6 (patch) | |
tree | fad9722825bb3fa796dd52c3fd4a8bf46b958cf9 /grammar/src/lib.rs | |
parent | afad02bdff111ecccb0077b9c989e869723c231c (diff) |
before a major refactor
I decide to adopt a new approach of recording and updating item
derivation forests. Since this affects a lot of things, I decide to
commit before the refactor, so that I can create a branch for that
refactor.
Diffstat (limited to 'grammar/src/lib.rs')
-rw-r--r-- | grammar/src/lib.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/grammar/src/lib.rs b/grammar/src/lib.rs index ab0f693..21ce2b4 100644 --- a/grammar/src/lib.rs +++ b/grammar/src/lib.rs @@ -25,6 +25,12 @@ use std::{ fmt::Display, }; +/// The index of the starting non-terminal. +/// +/// By convention this is the zero-th non-terminal. I define this +/// constant just for the sake of clarity. +pub const START_NONTERMINAL: usize = 0; + /// The type of a terminal. /// /// For the time being this is a wrapper around a string, but in the @@ -478,8 +484,17 @@ impl Grammar { /// Return true if and only if the terminal can appear as the /// first terminal in a string expanded from the non-terminal. + /// + /// # Errors + /// + /// If `non_terminal` or `terminal` is out of bounds, the function + /// returns an error indicating this fact. #[inline] pub fn is_first_of(&self, non_terminal: usize, terminal: usize) -> Result<bool, Error> { + if terminal >= self.ter_num() { + return Err(Error::IndexOutOfBounds(terminal, self.ter_num())); + } + Ok(self .firsts .get(non_terminal) @@ -488,6 +503,11 @@ impl Grammar { } /// Return true if and only if the non-terminal is nullable. + /// + /// # Error + /// + /// If `non_terminal` is out of bounds, return the corresponding + /// error. #[inline] pub fn is_nullable(&self, non_terminal: usize) -> Result<bool, Error> { Ok(self |