Skip to content
Snippets Groups Projects
mod.rs 1.28 KiB
Newer Older
Louis's avatar
Louis committed
pub mod ast;
mod atoms;
mod grammar;
#[cfg(test)]
mod test_suite;
Louis's avatar
Louis committed

use crate::error::{ForgeError, ForgeErrorKind, ForgeResult};
use crate::print_forge_error;
pub use atoms::TokenSlice;

pub fn slice<'a>(toks: &'a [crate::lexer::ScriptToken]) -> TokenSlice<'a> {
	TokenSlice(toks)
}

pub fn parse_expression(expr: &str) -> ForgeResult<ast::Expression> {
	let tokens = crate::lexer::script_to_tokens(expr)?;
	let result = match grammar::expression(&TokenSlice(tokens.as_slice())) {
		Ok(expr) => Ok(expr),
		Err(parse_error) => {
			let bad_token = &tokens[parse_error.location];
			Err(ForgeError {
				kind: ForgeErrorKind::UnexpectedToken {
					found: bad_token.clone(),
					expected: parse_error.expected,
				},
			})
		}
	};

	result.map_err(|e| {
		print_forge_error(expr, &e);
		e
	})
}

pub fn parse_program(prog: &str) -> ForgeResult<ast::Program> {
	let tokens = crate::lexer::script_to_tokens(prog)?;
	let result = match grammar::program(&TokenSlice(tokens.as_slice())) {
		Ok(prog) => Ok(prog.clone()),
		Err(parse_error) => {
			let bad_token = &tokens[parse_error.location];
			Err(ForgeError {
				kind: ForgeErrorKind::UnexpectedToken {
					found: bad_token.clone(),
					expected: parse_error.expected,
				},
			})
		}
	};

	result.map_err(|e| {
		print_forge_error(prog, &e);
		e
	})
}