1#![crate_type = "lib"]
2#[doc(inline)]
33pub use error_strategy::{BailErrorStrategy, DefaultErrorStrategy, ErrorStrategy};
34
35pub use input_stream::InputStream;
36
37#[doc(inline)]
38pub use lexer::{BaseLexer, Lexer};
39#[doc(inline)]
40pub use parser::{BaseParser, ListenerId, Parser};
41#[doc(inline)]
42pub use token_source::TokenSource;
43#[doc(hidden)]
45pub use prediction_context::PredictionContextCache;
46
47#[doc(inline)]
48pub use prediction_mode::PredictionMode;
49
50#[doc(inline)]
51pub use arena::Arena;
52#[cfg(feature = "arena-allocation-limit")]
53#[doc(inline)]
54pub use arena::{get_default_arena_alloc_limit, set_default_arena_alloc_limit};
55
56mod arena;
57#[doc(hidden)]
58pub mod atn_config;
59#[doc(hidden)]
60pub mod atn_simulator;
61pub mod int_stream;
62mod lexer_action;
63mod ll1_analyzer;
64#[doc(hidden)]
65pub mod recognizer;
66pub mod token_factory;
67#[doc(hidden)]
69pub mod atn_deserialization_options;
70#[doc(hidden)]
71pub mod atn_state;
72pub mod char_stream;
73#[doc(hidden)]
74pub mod interval_set;
75pub mod parser_rule_context;
76mod prediction_context;
77#[doc(hidden)]
78pub mod semantic_context;
79mod token_source;
80pub mod token_stream;
81#[doc(hidden)]
83pub mod dfa;
84#[doc(hidden)]
85pub mod transition;
86pub mod tree;
87#[doc(hidden)]
89pub mod atn;
90#[doc(hidden)]
91pub mod atn_config_set;
92#[doc(hidden)]
93pub mod atn_deserializer;
94pub mod common_token_stream;
95pub mod error_listener;
96pub mod error_strategy;
97pub mod errors;
98pub mod input_stream;
99pub mod lexer;
100#[doc(hidden)]
101pub mod lexer_action_executor;
102pub mod lexer_atn_simulator;
103pub mod parser;
104pub mod parser_atn_simulator;
105mod prediction_mode;
106pub mod token;
107pub mod trees;
108mod utils;
109mod atn_type;
111pub mod rule_context;
113pub mod vocabulary;
114
115#[cfg(feature = "stacker")]
117pub use stacker;
118
119pub const VERSION_MAJOR: &str = env!("CARGO_PKG_VERSION_MAJOR");
120pub const VERSION_MINOR: &str = env!("CARGO_PKG_VERSION_MINOR");
121
122pub const fn version_str_eq(a: &str, b: &str) -> bool {
125 if a.len() != b.len() {
126 return false;
127 }
128 let (a, b) = (a.as_bytes(), b.as_bytes());
129 let mut i = 0;
130 while i < a.len() {
131 if a[i] != b[i] {
132 return false;
133 }
134 i += 1;
135 }
136 true
137}
138
139#[macro_export]
140macro_rules! check_version {
141 ($major:literal, $minor:literal) => {
142 const _: () = assert!(
143 $crate::version_str_eq($major, $crate::VERSION_MAJOR)
144 && $crate::version_str_eq($minor, $crate::VERSION_MINOR),
145 "Generated parser is not compatible with current runtime version, \
146 please regenerate using the matching ANTLR tool version, \
147 or update the runtime to match the version used for generation."
148 );
149 };
150}
151
152#[macro_export]
153macro_rules! impl_tree {
154 ($enum_name:ident { $($variant:ident,)+ }) => {
156 impl<'input, 'arena> Tree<'arena> for $enum_name<'input, 'arena> {
157 fn get_parent(&self) -> Option<&'arena Self> {
158 match self {
159 $( $enum_name::$variant(inner) => inner.get_parent(), )+
160 _ => None,
161 }
162 }
163
164 fn has_parent(&self) -> bool {
165 match self {
166 $( $enum_name::$variant(inner) => inner.has_parent(), )+
167 _ => false,
168 }
169 }
170
171 fn get_child(&self, i: usize) -> Option<&'arena Self> {
178 match self {
179 $( $enum_name::$variant(inner) => inner.get_child(i), )+
180 _ => None,
181 }
182 }
183
184 fn get_child_count(&self) -> usize {
185 match self {
186 $( $enum_name::$variant(inner) => inner.get_child_count(), )+
187 _ => 0,
188 }
189 }
190
191 fn get_children<'a>(&'a self) -> Box<dyn Iterator<Item = &'arena Self> + 'a> {
192 match self {
193 $( $enum_name::$variant(inner) => inner.get_children(), )+
194 _ => Box::new(std::iter::empty()) as Box<dyn Iterator<Item = &'arena Self>>,
195 }
196 }
197
198 }
204 };
205}
206
207#[macro_export]
208macro_rules! impl_node_kind_common {
209 ($node_kind:ident { $($labeled_variant:ident($inner:ident),)* ; $($variant:ident),* }) => {
211 fn cast_to_ctx<'n, 'input: 'arena>(
212 node: &'n TreeNode<'input, 'arena, Self, Tok>,
213 ) -> &'n dyn ParserRuleContext<'input, 'arena> {
214 match node.node_tag() {
215 $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>), )*
216 $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>), )*
217 $node_kind::Terminal => $crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>),
218 $node_kind::Error => $crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>),
219 }
220 }
221
222 fn cast_to_ctx_mut<'n, 'input: 'arena>(
223 node: &'n mut TreeNode<'input, 'arena, Self, Tok>,
224 ) -> &'n mut dyn ParserRuleContext<'input, 'arena> {
225 match node.node_tag() {
226 $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => mut $inner<'input, 'arena, Tok>), )*
227 $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => mut $variant<'input, 'arena, Tok>), )*
228 $node_kind::Terminal => $crate::cast_unchecked!(node.ctx_ptr() => mut TerminalNode<'input, 'arena, Tok>),
229 $node_kind::Error => $crate::cast_unchecked!(node.ctx_ptr() => mut ErrorNode<'input, 'arena, Tok>),
230 }
231 }
232
233 fn set_alt_number<'input: 'arena>(node: &mut TreeNode<'input, 'arena, Self, Tok>, alt_number: i32) {
234 match node.node_tag() {
235 $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => mut $inner<'input, 'arena, Tok>).set_alt_number(alt_number), )*
236 $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => mut $variant<'input, 'arena, Tok>).set_alt_number(alt_number), )*
237 _ => {}
238 }
239 }
240
241 fn get_rule_index<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>) -> usize {
242 match node.node_tag() {
243 $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).get_rule_index(), )*
244 $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>).get_rule_index(), )*
245 _ => 0,
246 }
247 }
248
249 fn get_alt_number<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>) -> i32 {
250 match node.node_tag() {
251 $( $node_kind::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).get_alt_number(), )*
252 $( $node_kind::$variant => $crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>).get_alt_number(), )*
253 _ => INVALID_ALT,
254 }
255 }
256
257 #[inline]
258 fn terminal() -> Self {
259 Self::Terminal
260 }
261
262 #[inline]
263 fn error() -> Self {
264 Self::Error
265 }
266
267 #[inline]
268 fn is_context(&self) -> bool {
269 !matches!(self, Self::Terminal | Self::Error)
270 }
271 };
272}
273
274#[macro_export]
275macro_rules! impl_node_kind {
276 ($enum_name:ident { $($labeled_variant:ident($inner:ident),)* ; $($variant:ident),* }; ) => {
278 impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
279 type Listener = dyn ParseTreeListener<'arena, Self, Tok>;
280
281 $crate::impl_node_kind_common! { $enum_name { $($labeled_variant($inner),)* ; $($variant),* } }
282
283 fn enter_rule<'input: 'arena>(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
284 Ok(())
285 }
286
287 fn exit_rule<'input: 'arena>(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
288 Ok(())
289 }
290 }
291 };
292
293 ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($visit_method:ident),)* }; visitor = $visitor:ty, ) => {
295 impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
296 type Listener = dyn ParseTreeListener<'arena, Self, Tok>;
297
298 $crate::impl_node_kind_common! { $enum_name { $( $labeled_variant($inner),)*; $($variant),* } }
299
300 fn enter_rule(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
301 Ok(())
302 }
303
304 fn exit_rule(_node: &TreeNode<'input, 'arena, Self, Tok>, _listener: &mut Self::Listener) -> Result<(), ANTLRError> {
305 Ok(())
306 }
307
308 }
318 };
319
320 ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($enter_method:ident, $exit_method:ident, ),)* }; listener = $listener:ty, ) => {
322 impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
323 type Listener = $listener;
324
325 $crate::impl_node_kind_common! { $enum_name { $( $labeled_variant($inner),)*; $($variant),* } }
326
327 fn enter_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
328 match node.node_tag() {
329 $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_enter(listener), )*
330 $( $enum_name::$variant => listener.$enter_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
331 $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
332 $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
333 }
334 }
335
336 fn exit_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
337 match node.node_tag() {
338 $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_exit(listener), )*
339 $( $enum_name::$variant => listener.$exit_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
340 $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
341 $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
342 }
343 }
344 }
345 };
346
347 ($enum_name:ident { $($labeled_variant:ident($inner:ident),)*; $($variant:ident($enter_method:ident, $exit_method:ident, $visit_method:ident),)* }; listener = $listener:ty, visitor = $visitor:ident, ) => {
349 impl<'arena, Tok: Token + 'arena> NodeKindType<'arena, Tok> for $enum_name {
350 type Listener = $listener;
351
352 $crate::impl_node_kind_common! { $enum_name { $($labeled_variant($inner),)*; $($variant),* } }
353
354 fn enter_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
355 match node.node_tag() {
356 $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_enter(listener), )*
357 $( $enum_name::$variant => listener.$enter_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
358 $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
359 $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
360 }
361 }
362
363 fn exit_rule<'input: 'arena>(node: &TreeNode<'input, 'arena, Self, Tok>, listener: &mut Self::Listener) -> Result<(), ANTLRError> {
364 match node.node_tag() {
365 $( $enum_name::$labeled_variant => $crate::cast_unchecked!(node => $inner<'input, 'arena, Tok>).dispatch_exit(listener), )*
366 $( $enum_name::$variant => listener.$exit_method($crate::cast_unchecked!(node.ctx_ptr() => $variant<'input, 'arena, Tok>)), )*
367 $enum_name::Terminal => { listener.visit_terminal($crate::cast_unchecked!(node.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
368 $enum_name::Error => { listener.visit_error_node($crate::cast_unchecked!(node.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
369 }
370 }
371 }
372
373 impl<'input, 'arena, Tok: Token + 'arena> Visitable<'input, 'arena, Tok> for TreeNode<'input, 'arena, $enum_name, Tok>
374 where
375 'input: 'arena,
376 {
377 fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
378 where
379 V: $visitor<'input, 'arena, Tok> + ?Sized,
380 {
381 match self.node_tag() {
382 $( $enum_name::$labeled_variant => $crate::cast_unchecked!(self => $inner<'input, 'arena, Tok>).accept(visitor), )*
383 $( $enum_name::$variant => visitor.$visit_method($crate::cast_unchecked!(self.ctx_ptr() => $variant<'input, 'arena, Tok>)), )+
384 $enum_name::Terminal => { visitor.visit_terminal($crate::cast_unchecked!(self.ctx_ptr() => TerminalNode<'input, 'arena, Tok>)) },
385 $enum_name::Error => { visitor.visit_error_node($crate::cast_unchecked!(self.ctx_ptr() => ErrorNode<'input, 'arena, Tok>)) },
386 }
387 }
388 }
389 };
390}
391
392#[macro_export]
393macro_rules! impl_listener_dispatch {
394 ($listener:ident::$node_name:ident::$enum_name:ident { $($variant:ident($enter_method:ident, $exit_method:ident),)+ }) => {
396 impl<'input, 'arena, Tok: Token + 'input> $enum_name<'input, 'arena, Tok>
397 where
398 'input: 'arena,
399 {
400 fn dispatch_enter(&self, listener: &mut (dyn $listener<'arena, Tok> + 'static)) -> Result<(), ANTLRError>
401 {
402 match self {
403 $( $enum_name::$variant(inner) => listener.$enter_method(inner), )+
404 $enum_name::Error(_) => Ok(()),
405 }
406 }
407
408 fn dispatch_exit(&self, listener: &mut (dyn $listener<'arena, Tok> + 'static)) -> Result<(), ANTLRError>
409 {
410 match self {
411 $( $enum_name::$variant(inner) => listener.$exit_method(inner), )+
412 $enum_name::Error(_) => Ok(()),
413 }
414 }
415 }
416 };
417}
418
419#[macro_export]
420macro_rules! impl_visitable {
421 ($visitor:ident::$enum_name:ident { $($variant:ident($visit_method:ident),)+ }) => {
423 impl<'input, 'arena, Tok: Token + 'input> Visitable<'input, 'arena, Tok> for $enum_name<'input, 'arena, Tok> {
424 fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
425 where
426 V: $visitor<'input, 'arena, Tok> + ?Sized,
427 {
428 match self {
429 $( $enum_name::$variant(inner) => visitor.$visit_method(inner), )+
430 $enum_name::Error(_) => Ok(Default::default()),
431 }
432 }
433 }
434 };
435 ($visitor:ident::$ctx_name:ident($visit_method:ident)) => {
436 impl<'input, 'arena, Tok: Token + 'input> Visitable<'input, 'arena, Tok> for $ctx_name<'input, 'arena, Tok> {
437 fn accept<V>(&'arena self, visitor: &mut V) -> Result<V::Return, ANTLRError>
438 where
439 V: $visitor<'input, 'arena, Tok> + ?Sized,
440 {
441 visitor.$visit_method(self)
442 }
443 }
444 };
445}
446
447#[macro_export]
448macro_rules! impl_rule_context {
449 ($enum_name:ident { $($ref_variant:ident,)* } $({ $($inline_variant:ident,)+ })?) => {
451 impl<'input, 'arena, Tok> RuleContext<'arena> for $enum_name<'input, 'arena, Tok>
452 where
453 'input: 'arena,
454 Tok: Token + 'input,
455 {
456 fn get_rule_index(&self) -> usize {
457 match self {
458 $( $enum_name::$ref_variant(inner) => RuleContext::get_rule_index(&**inner), )*
460 $($( $enum_name::$inline_variant(inner) => RuleContext::get_rule_index(inner), )+)?
461 }
462 }
463
464 fn get_alt_number(&self) -> i32 {
465 match self {
466 $( $enum_name::$ref_variant(inner) => RuleContext::get_alt_number(&**inner), )*
467 $($( $enum_name::$inline_variant(inner) => RuleContext::get_alt_number(inner), )+)?
468 }
469 }
470
471 fn get_invoking_state(&self) -> i32 {
472 match self {
473 $( $enum_name::$ref_variant(inner) => RuleContext::get_invoking_state(&**inner), )*
474 $($( $enum_name::$inline_variant(inner) => RuleContext::get_invoking_state(inner), )+)?
475 }
476 }
477
478 fn get_parent_ctx(&self) -> Option<&'arena dyn RuleContext<'arena>> {
479 match self {
480 $( $enum_name::$ref_variant(inner) => RuleContext::get_parent_ctx(&**inner), )*
481 $($( $enum_name::$inline_variant(inner) => RuleContext::get_parent_ctx(inner), )+)?
482 }
483 }
484
485 fn get_node_text(&self, rule_names: &[&str]) -> String {
486 match self {
487 $( $enum_name::$ref_variant(inner) => RuleContext::get_node_text(&**inner, rule_names), )*
488 $($( $enum_name::$inline_variant(inner) => RuleContext::get_node_text(inner, rule_names), )+)?
489 }
490 }
491
492 }
493 };
494}
495
496#[macro_export]
497macro_rules! impl_parser_rule_context {
498 ($enum_name:ident { $($ref_variant:ident,)* } $({ $($inline_variant:ident,)+ })?) => {
500 impl<'input, 'arena, Tok> ParserRuleContext<'input, 'arena> for $enum_name<'input, 'arena, Tok>
501 where
502 'input: 'arena,
503 Tok: Token + 'input,
504 {
505 fn start(&self) -> &'arena dyn $crate::token::Token {
506 match self {
507 $( $enum_name::$ref_variant(inner) => ParserRuleContext::start(&**inner), )*
508 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::start(inner), )+)?
509 }
510 }
511
512 fn stop(&self) -> &'arena dyn $crate::token::Token {
513 match self {
514 $( $enum_name::$ref_variant(inner) => ParserRuleContext::stop(&**inner), )*
515 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::stop(inner), )+)?
516 }
517 }
518
519 fn get_parent_ctx(&self) -> Option<&'arena dyn ParserRuleContext<'input, 'arena>> {
520 match self {
521 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_parent_ctx(&**inner), )*
522 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_parent_ctx(inner), )+)?
523 }
524 }
525
526 fn get_child_ctx(&self, _i: usize) -> Option<&'arena dyn ParserRuleContext<'input, 'arena>> {
527 match self {
528 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_child_ctx(&**inner, _i), )*
529 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_child_ctx(inner, _i), )+)?
530 }
531 }
532
533 fn get_child_count(&self) -> usize {
534 match self {
535 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_child_count(&**inner), )*
536 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_child_count(inner), )+)?
537 }
538 }
539
540 fn iter_children<'a>(
541 &'a self,
542 ) -> Box<dyn Iterator<Item = &'arena dyn ParserRuleContext<'input, 'arena>> + 'a>
543 where
544 'input: 'a,
545 'arena: 'a,
546 {
547 match self {
548 $( $enum_name::$ref_variant(inner) => ParserRuleContext::iter_children(&**inner), )*
549 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::iter_children(inner), )+)?
550 }
551 }
552
553 fn get_token(&self, _ttype: i32, _pos: usize) -> Option<&dyn $crate::token::Token> {
554 match self {
555 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_token(&**inner, _ttype, _pos), )*
556 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_token(inner, _ttype, _pos), )+)?
557 }
558 }
559
560 fn get_tokens(&self, _ttype: i32) -> Vec<&dyn $crate::token::Token> {
561 match self {
562 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_tokens(&**inner, _ttype), )*
563 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_tokens(inner, _ttype), )+)?
564 }
565 }
566
567 fn get_text(&self) -> String {
568 match self {
569 $( $enum_name::$ref_variant(inner) => ParserRuleContext::get_text(&**inner), )*
570 $($( $enum_name::$inline_variant(inner) => ParserRuleContext::get_text(inner), )+)?
571 }
572 }
573 }
574 };
575}
576
577#[macro_export]
578macro_rules! impl_tree_trait_delegates {
579 ($node_kind:ident::$enum_name:ident { $($variant:ident),+ $(,)? }) => {
580 impl<'input, 'arena, Tok> $enum_name<'input, 'arena, Tok>
581 where
582 'input: 'arena,
583 Tok: Token + 'input,
584 {
585 fn set_alt_number(&mut self, alt_number: i32) {
640 match self {
641 $( $enum_name::$variant(inner) => inner.set_alt_number(alt_number), )+
642 }
643 }
644
645 }
663 };
664}
665
666#[macro_export]
667macro_rules! impl_node_inner {
668 ($node_kind:ident::$node_variant:ident::$context_all:ident { $($variant:ident),+ $(,)? }) => {
669 impl<'input, 'arena, Tok> NodeInner<'input, 'arena, $node_kind, Tok>
670 for $context_all<'input, 'arena, Tok>
671 where
672 'input: 'arena,
673 Tok: Token + 'input,
674 {
675 fn cast_from<'a>(node: &'a TreeNode<'input, 'arena, $node_kind, Tok>) -> Option<&'a Self> {
676 match node.node_tag() {
677 $node_kind::$node_variant => Some($crate::cast_unchecked!(node => Self)),
678 _ => None,
679 }
680 }
681
682 fn cast_from_mut<'a>(node: &'a mut TreeNode<'input, 'arena, $node_kind, Tok>) -> Option<&'a mut Self>
683 where
684 Self: Sized,
685 {
686 match node.node_tag() {
687 $node_kind::$node_variant => Some($crate::cast_unchecked!(node => mut Self)),
688 _ => None,
689 }
690 }
691
692 fn as_node(&self) -> &TreeNode<'input, 'arena, $node_kind, Tok> {
693 $crate::cast_unchecked!(self => TreeNode<'input, 'arena, $node_kind, Tok>)
694 }
695
696 fn as_node_mut(&mut self) -> &mut TreeNode<'input, 'arena, $node_kind, Tok> {
697 $crate::cast_unchecked!(self => mut TreeNode<'input, 'arena, $node_kind, Tok>)
698 }
699
700 fn iter_child_nodes<'a>(&'a self) -> Box<dyn Iterator<Item = &'arena TreeNode<'input, 'arena, $node_kind, Tok>> + 'a> {
701 match self {
702 $( $context_all::$variant(inner) => inner.get_children(), )+
703 }
704 }
705 }
706 };
707}
708
709#[macro_export]
710macro_rules! impl_token_source {
711 ($lexer:ident) => {
712 impl<'input, 'arena, Input, TF> $crate::TokenSource<'input, 'arena, TF>
713 for $lexer<'input, 'arena, Input, TF>
714 where
715 TF: $crate::token_factory::TokenFactory<'input, 'arena> + 'arena,
716 Input: $crate::char_stream::CharStream<'input>,
717 {
718 fn next_token(&mut self) -> &'arena mut TF::Tok {
719 self.base.next_token()
720 }
721
722 fn get_line(&self) -> u32 {
723 self.base.get_line()
724 }
725
726 fn get_char_position_in_line(&self) -> i32 {
727 self.base.get_char_position_in_line()
728 }
729
730 fn get_input_stream(&mut self) -> Option<&mut dyn $crate::int_stream::IntStream> {
731 self.base.get_input_stream()
732 }
733
734 fn get_source_name(&self) -> String {
735 self.base.get_source_name()
736 }
737
738 fn get_token_factory(&self) -> &TF {
739 self.base.get_token_factory()
740 }
741
742 fn get_dfa_string(&self) -> String {
743 self.base.get_dfa_string()
744 }
745 }
746 };
747}
748
749#[macro_export]
750macro_rules! impl_deref {
751 (parser => $parser_name:ident) => {
752 impl<'input, 'arena, Input, TF> Deref for $parser_name<'input, 'arena, Input, TF>
753 where
754 'input: 'arena,
755 TF: TokenFactory<'input, 'arena> + 'arena,
756 Input: TokenStream<'input, 'arena, TF> + 'arena,
757 {
758 type Target = BaseParserType<'input, 'arena, Input, TF>;
759 fn deref(&self) -> &Self::Target {
760 &self.base
761 }
762 }
763
764 impl<'input, 'arena, Input, TF> DerefMut for $parser_name<'input, 'arena, Input, TF>
765 where
766 'input: 'arena,
767 TF: TokenFactory<'input, 'arena> + 'arena,
768 Input: TokenStream<'input, 'arena, TF> + 'arena,
769 {
770 fn deref_mut(&mut self) -> &mut Self::Target {
771 &mut self.base
772 }
773 }
774 };
775 (lexer => $lexer_name:ident) => {
776 impl<'input, 'arena, Input, TF> Deref for $lexer_name<'input, 'arena, Input, TF>
777 where
778 'input: 'arena,
779 TF: TokenFactory<'input, 'arena> + 'arena,
780 Input: CharStream<'input> + 'arena,
781 {
782 type Target = BaseLexerType<'input, 'arena, Input, TF>;
783 fn deref(&self) -> &Self::Target {
784 &self.base
785 }
786 }
787
788 impl<'input, 'arena, Input, TF> DerefMut for $lexer_name<'input, 'arena, Input, TF>
789 where
790 'input: 'arena,
791 TF: TokenFactory<'input, 'arena> + 'arena,
792 Input: CharStream<'input> + 'arena,
793 {
794 fn deref_mut(&mut self) -> &mut Self::Target {
795 &mut self.base
796 }
797 }
798 };
799}
800
801pub const STACKER_RED_ZONE_BYTES: usize = 64 * 1024;
802pub const STACKER_GROWTH_BYTES: usize = 1024 * 1024;
803
804#[cfg(feature = "stacker")]
805#[macro_export]
806macro_rules! maybe_grow_stack {
807 ($body:block) => {
808 $crate::stacker::maybe_grow(
809 $crate::STACKER_RED_ZONE_BYTES,
810 $crate::STACKER_GROWTH_BYTES,
811 || $body,
812 )
813 };
814}
815#[cfg(not(feature = "stacker"))]
816#[macro_export]
817macro_rules! maybe_grow_stack {
818 ($body:block) => {
819 $body
820 };
821}
822
823#[macro_export]
824macro_rules! cast_unchecked {
825 ($ptr:expr => $target:ty) => {{
826 let ptr = ($ptr as *const _ as *const ()).cast::<$target>();
827 unsafe { &*ptr }
828 }};
829 ($ptr:expr => mut $target:ty) => {{
830 let ptr = ($ptr as *mut _ as *mut ()).cast::<$target>();
831 unsafe { &mut *ptr }
832 }};
833}