diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 00:47:55 +0000 |
commit | 26a029d407be480d791972afb5975cf62c9360a6 (patch) | |
tree | f435a8308119effd964b339f76abb83a57c29483 /third_party/rust/jsparagus-generated-parser/src/traits/mod.rs | |
parent | Initial commit. (diff) | |
download | firefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz firefox-26a029d407be480d791972afb5975cf62c9360a6.zip |
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/jsparagus-generated-parser/src/traits/mod.rs')
-rw-r--r-- | third_party/rust/jsparagus-generated-parser/src/traits/mod.rs | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/third_party/rust/jsparagus-generated-parser/src/traits/mod.rs b/third_party/rust/jsparagus-generated-parser/src/traits/mod.rs new file mode 100644 index 0000000000..69e2c7daed --- /dev/null +++ b/third_party/rust/jsparagus-generated-parser/src/traits/mod.rs @@ -0,0 +1,36 @@ +use crate::error::Result; +use crate::parser_tables_generated::Term; + +/// This macro is pre-processed by the python grammar processor and generate +/// code out-side the current context. +#[macro_export] +macro_rules! grammar_extension { + ( $($_:tt)* ) => {}; +} + +/// Aggregate a Value (= StackValue or ()) and a nonterminal/terminal as a stack +/// element. The term is currently used for replaying the parse table when +/// handling errors and non-optimized reduced actions with lookahead. +#[derive(Debug)] +pub struct TermValue<Value> { + pub term: Term, + pub value: Value, +} + +/// The parser trait is an abstraction to define the primitive of an LR Parser +/// with variable lookahead which can be replayed. +pub trait ParserTrait<'alloc, Value> { + fn shift(&mut self, tv: TermValue<Value>) -> Result<'alloc, bool>; + fn shift_replayed(&mut self, state: usize); + fn unshift(&mut self); + fn rewind(&mut self, n: usize) { + for _ in 0..n { + self.unshift(); + } + } + fn pop(&mut self) -> TermValue<Value>; + fn replay(&mut self, tv: TermValue<Value>); + fn epsilon(&mut self, state: usize); + fn top_state(&self) -> usize; + fn check_not_on_new_line(&mut self, peek: usize) -> Result<'alloc, bool>; +} |