diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/rust/jsparagus-parser/src/lib.rs | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/third_party/rust/jsparagus-parser/src/lib.rs b/third_party/rust/jsparagus-parser/src/lib.rs new file mode 100644 index 0000000000..e78744afa5 --- /dev/null +++ b/third_party/rust/jsparagus-parser/src/lib.rs @@ -0,0 +1,111 @@ +#![cfg_attr(feature = "unstable", feature(test))] + +mod lexer; +pub mod numeric_value; +mod parser; +mod queue_stack; +mod simulator; +mod unicode; +mod unicode_data; + +#[cfg(test)] +mod tests; + +extern crate arrayvec; +extern crate jsparagus_ast as ast; +extern crate jsparagus_generated_parser as generated_parser; +extern crate jsparagus_json_log as json_log; + +use crate::parser::Parser; +use ast::{ + arena, + source_atom_set::SourceAtomSet, + source_slice_list::SourceSliceList, + types::{Module, Script}, +}; +use bumpalo; +use generated_parser::{ + AstBuilder, StackValue, TerminalId, START_STATE_MODULE, START_STATE_SCRIPT, TABLES, +}; +pub use generated_parser::{ParseError, Result}; +use json_log::json_debug; +use lexer::Lexer; +use std::cell::RefCell; +use std::rc::Rc; + +pub struct ParseOptions {} +impl ParseOptions { + pub fn new() -> Self { + Self {} + } +} + +pub fn parse_script<'alloc>( + allocator: &'alloc bumpalo::Bump, + source: &'alloc str, + _options: &ParseOptions, + atoms: Rc<RefCell<SourceAtomSet<'alloc>>>, + slices: Rc<RefCell<SourceSliceList<'alloc>>>, +) -> Result<'alloc, arena::Box<'alloc, Script<'alloc>>> { + json_debug!({ + "parse": "script", + }); + Ok(parse(allocator, source, START_STATE_SCRIPT, atoms, slices)?.to_ast()?) +} + +pub fn parse_module<'alloc>( + allocator: &'alloc bumpalo::Bump, + source: &'alloc str, + _options: &ParseOptions, + atoms: Rc<RefCell<SourceAtomSet<'alloc>>>, + slices: Rc<RefCell<SourceSliceList<'alloc>>>, +) -> Result<'alloc, arena::Box<'alloc, Module<'alloc>>> { + json_debug!({ + "parse": "module", + }); + Ok(parse(allocator, source, START_STATE_MODULE, atoms, slices)?.to_ast()?) +} + +fn parse<'alloc>( + allocator: &'alloc bumpalo::Bump, + source: &'alloc str, + start_state: usize, + atoms: Rc<RefCell<SourceAtomSet<'alloc>>>, + slices: Rc<RefCell<SourceSliceList<'alloc>>>, +) -> Result<'alloc, StackValue<'alloc>> { + let mut tokens = Lexer::new(allocator, source.chars(), atoms.clone(), slices.clone()); + + TABLES.check(); + + let mut parser = Parser::new(AstBuilder::new(allocator, atoms, slices), start_state); + + loop { + let t = tokens.next(&parser)?; + if t.terminal_id == TerminalId::End { + break; + } + parser.write_token(t)?; + } + parser.close(tokens.offset()) +} + +pub fn is_partial_script<'alloc>( + allocator: &'alloc bumpalo::Bump, + source: &'alloc str, + atoms: Rc<RefCell<SourceAtomSet<'alloc>>>, + slices: Rc<RefCell<SourceSliceList<'alloc>>>, +) -> Result<'alloc, bool> { + let mut parser = Parser::new( + AstBuilder::new(allocator, atoms.clone(), slices.clone()), + START_STATE_SCRIPT, + ); + let mut tokens = Lexer::new(allocator, source.chars(), atoms, slices); + loop { + let t = tokens.next(&parser)?; + if t.terminal_id == TerminalId::End { + break; + } + parser.write_token(t)?; + } + Ok(!parser.can_close()) +} |