pub mod ast;
mod engine;
mod common;
pub mod error;
pub mod grammar;
pub mod lexer;
pub mod load_grammar;
mod macros;
pub mod parser;
pub mod parser_frontends;
pub mod preclude;
mod transform;
use crate::ast::Ast;
pub use crate::engine::ParserEngine;
use crate::grammar::Algorithm;
use crate::load_grammar::load_grammar;
use crate::parser_frontends::GrammarRuntime;
use error::SwiftletError;
use std::sync::Arc;
#[derive(Clone, Debug)]
pub enum Ambiguity {
Resolve,
Explicit,
}
#[derive(Debug, Clone)]
pub struct ParserConfig {
pub start: String,
pub algorithm: Algorithm,
pub ambiguity: Ambiguity,
pub debug: bool,
}
impl Default for ParserConfig {
fn default() -> Self {
Self {
start: "start".to_string(),
algorithm: Algorithm::Earley,
ambiguity: Ambiguity::Resolve,
debug: false,
}
}
}
fn normalize_grammar(grammar: &str) -> String {
format!(
r#"{}
"#,
grammar.trim()
)
}
pub struct Swiftlet {
frontend: Arc<GrammarRuntime>,
}
impl Swiftlet {
pub fn from_str(grammar: &str) -> Result<Self, SwiftletError> {
let grammar = normalize_grammar(grammar);
#[cfg(feature = "debug")]
let frontend = load_grammar(&grammar, Arc::new(ParserConfig::default()))?;
#[cfg(not(feature = "debug"))]
let frontend = load_grammar(&grammar)?;
Ok(Self { frontend })
}
pub fn from_file(path: &str) -> Result<Self, SwiftletError> {
let content = std::fs::read_to_string(path).map_err(|source| {
SwiftletError::GrammarFileReadError {
path: path.to_string(),
source,
}
})?;
Self::from_str(&content)
}
pub fn parser(&self, parser_option: Arc<ParserConfig>) -> Parser {
Parser {
parser_engine: ParserEngine::new(self.frontend.clone(), parser_option),
}
}
}
pub struct Parser {
parser_engine: ParserEngine,
}
impl Parser {
pub fn parse(&self, text: &str) -> Result<Ast, SwiftletError> {
self.parser_engine.parse(text)
}
}