extern crate std;
pub mod lexer;
#[macro_use] pub mod parser;
use std::error::Error as FmtError;
use self::Error::*;
#[derive(Debug)]
pub enum Error {
LexingError(lexer::Error),
ParsingError(parser::Error),
}
impl From<lexer::Error> for Error {
fn from(error: lexer::Error) -> Self {
LexingError(error)
}
}
impl From<parser::Error> for Error {
fn from(error: parser::Error) -> Self {
ParsingError(error)
}
}
impl std::fmt::Display for Error {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.description())
}
}
impl std::error::Error for Error {
fn description(&self) -> &str {
match *self {
LexingError(ref err) => err.description(),
ParsingError(ref err) => err.description(),
}
}
}
pub fn compile(entry: &std::path::Path) -> Result<parser::Parser, Error> {
let mut lexer = lexer::new();
let ret = lexer.lex(entry);
match ret {
Ok(_) => {},
Err(err) => {
error!("Lexing phase failed, errors have been encountered");
let errors = lexer.errors_get();
for l_err in errors {
error!(" > in file {} at line {}, column {}: {}",
l_err.file,
l_err.line, l_err.column,
l_err.message);
}
return Err(LexingError(err));
}
}
let mut parser = parser::Parser::new();
try!(parser.parse(&lexer));
Ok(parser)
}