summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jsparagus-generated-parser/src/traits
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/jsparagus-generated-parser/src/traits
parentInitial commit. (diff)
downloadfirefox-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')
-rw-r--r--third_party/rust/jsparagus-generated-parser/src/traits/mod.rs36
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>;
+}