pub mod clex_language;
use crate::clex_language::clex_error_type::ClexErrorType;
use crate::clex_language::lexer::Token;
use crate::clex_language::{ast::ClexLanguageAST, code_generator, lexer, parser};
#[derive(Debug)]
pub struct ClexError {
error: ClexErrorType,
source: String,
}
impl ClexError {
pub fn new(error: ClexErrorType, source: String) -> Self {
Self { error, source }
}
pub fn error(&self) -> &ClexErrorType {
&self.error
}
pub fn source(&self) -> &str {
&self.source
}
pub fn format_with_context(&self) -> String {
self.error.format_with_source(&self.source)
}
}
impl From<ClexErrorType> for ClexError {
fn from(error: ClexErrorType) -> Self {
Self {
error,
source: String::new(),
}
}
}
impl std::fmt::Display for ClexError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{}", self.format_with_context())
}
}
impl std::error::Error for ClexError {}
pub fn get_tokens(language: String) -> Result<Vec<Token>, ClexError> {
let source = language.clone();
let mut token = lexer::Tokens::new(language);
token.scan_tokens().map_err(|e| ClexError::new(e, source))?;
Ok(token.get_tokens())
}
pub fn get_ast(language: String) -> Result<ClexLanguageAST, ClexError> {
let source = language.clone();
let mut parser =
parser::Parser::new(language).map_err(|e| ClexError::new(e, source.clone()))?;
parser.parser().map_err(|e| ClexError::new(e, source))?;
Ok(parser.get_language().clone())
}
pub fn generator(language: String) -> Result<String, ClexError> {
let source = language.clone();
let mut parser =
parser::Parser::new(language).map_err(|e| ClexError::new(e, source.clone()))?;
parser
.parser()
.map_err(|e| ClexError::new(e, source.clone()))?;
let generator = code_generator::Generator::new(&parser);
generator
.generate_testcases()
.map_err(|e| ClexError::new(e, source))
}