1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
#![crate_type = "lib"] #![feature(try_blocks)] //#![feature(nll)] #![feature(raw)] #![feature(inner_deref)] #![feature(is_sorted)] #![feature(cell_update)] #![feature(get_mut_unchecked)] #![feature(specialization)] #![feature(coerce_unsized)] #![feature(unsize)] #![feature(associated_type_defaults)] #![warn(rust_2018_idioms)] #![warn(missing_docs)] // warn if there is missing docs #![warn(missing_debug_implementations)] #![warn(trivial_numeric_casts)] //! # Antlr4 runtime //! //! **This is pre-release version.** //! **Some small breaking changes are still possible, although none is currently planned** //! //! This is a Rust runtime for [ANTLR4] parser generator. //! It is required to use parsers and lexers generated by [ANTLR4] parser generator //! //! This documentation refers to particular api used by generated parsers,lexers and syntax trees. //! //! For info on what is [ANTLR4] and how to generate parser please refer to: //! - [ANTLR4] main repository //! - [README] for Rust target //! //! [ANTLR4]: https://github.com/antlr/antlr4 //! [README]: https://github.com/rrevenantt/antlr4rust/blob/master/README.md //! //! ### Customization //! //! All input and output can be customized and optimized for particular usecase by implementing //! related trait. Each of them already has different implementations that should be enough for most cases. //! For more details see docs for corresponding trait and containing module. //! //! Currently available are: //! - [`CharStream`] - Lexer input, stream of char values with slicing support //! - [`TokenFactory`] - How lexer creates tokens. //! - [`Token`] - Element of [`TokenStream`] //! - [`TokenStream`] - Parser input, created from lexer or other token source. //! - [`ParserRuleContext`] - Node of created syntax tree. //! //! ### Zero-copy and lifetimes //! //! This library supports full zero-copy parsing. To allow this //! `'input` lifetime is used everywhere inside to refer to data borrowed by parser. //! Besides reference to input it also can be [`TokenFactory`] if it returns references to tokens. //! See [`ArenaFactory`] as an example of such behavior. It allocates tokens in [`Arena`](typed_arena::Arena) and return references. //! //! Using generated parse tree you should be careful to not require longer lifetime after the parsing. //! If that's the case you will likely get "does not live long enough" error on the input string, //! despite actual lifetime conflict is happening much later //! //! If you need to generate owned versions of parse tree or you want simpler usage, //! you can opt out zero-copy by requiring `'input` to be static. In this case it is easier to also use //! types that contains "owned" in their name or constructor function like `OwningTokenFactory` //! or `InputStream::new_owned()` //! //! ### Visitors and Listeners //! //! Currently visitors and listeners must outlive `'input`. //! In practice this means that visitor has either `'static` or `'input` lifetime. //! Thus you can retrieve references to parsed data from syntax tree to save in listener/visitor //! (as example you can see visitor test). This should cover 99% of usecases. //! //! You can try to give visitor outside references but in this case //! if those references do not outlive `'input` you will get very confusing error messages, //! so this is not recommended. //! //! ### Downcasting //! //! Rule context trait object support downcasting even for zero-copy case. //! Also generic types(currently these are `H:ErrorStrategy` and `I:`[`TokenStream`]) that you can //! access in generated parser from embedded actions also can be downcasted to concrete types. //! To do it `TidExt::downcast_*` extension methods should be used. //! //! [`CharStream`]: crate::char_stream::CharStream //! [`TokenFactory`]: crate::token_factory::TokenFactory //! [`ArenaFactory`]: crate::token_factory::ArenaFactory //! [`Token`]: crate::token::Token //! [`TokenStream`]: crate::token_stream::TokenStream //! [`ParserRuleContext`]: crate::parser_rule_context::ParserRuleContext #[macro_use] extern crate lazy_static; #[doc(hidden)] pub use lazy_static::lazy_static; #[doc(hidden)] pub use better_any::{impl_tid, type_id, Tid, TidAble, TidExt}; #[doc(inline)] pub use error_strategy::{BailErrorStrategy, DefaultErrorStrategy, ErrorStrategy}; #[doc(inline)] pub use input_stream::InputStream; // #[doc(inline)] // pub use input_stream::CodePointInputStream; #[doc(inline)] pub use lexer::{BaseLexer, Lexer}; #[doc(inline)] pub use parser::{BaseParser, ListenerId, Parser}; //extern crate uuid; #[doc(inline)] pub use prediction_context::PredictionContextCache; pub mod atn_config; pub mod atn_simulator; pub mod int_stream; mod lexer_action; mod ll1_analyzer; pub mod recognizer; pub mod token_factory; //pub mod tokenstream_rewriter; #[doc(hidden)] pub mod atn_deserialization_options; #[doc(hidden)] pub mod atn_state; pub mod char_stream; #[doc(hidden)] pub mod dfa_state; pub mod interval_set; pub mod parser_rule_context; mod prediction_context; #[doc(hidden)] pub mod semantic_context; pub mod token_source; pub mod token_stream; //pub mod trace_listener; #[doc(hidden)] pub mod dfa; #[doc(hidden)] pub mod transition; pub mod tree; //pub mod file_stream; #[doc(hidden)] pub mod atn; #[doc(hidden)] pub mod atn_config_set; #[doc(hidden)] pub mod atn_deserializer; pub mod common_token_stream; mod dfa_serializer; pub mod error_listener; pub mod error_strategy; pub mod errors; mod input_stream; pub mod lexer; #[doc(hidden)] pub mod lexer_action_executor; pub mod lexer_atn_simulator; pub mod parser; pub mod parser_atn_simulator; pub mod prediction_mode; pub mod token; pub mod trees; mod utils; //pub mod tokenstream_rewriter_test; mod atn_type; pub mod rule_context; pub mod vocabulary; //#[cfg(test)] // tests are either integration tests in "tests" foulder or unit tests in some modules