1mod lexical_analysis;
2pub use lexical_analysis::parse as lex_parse;
3pub use lexical_analysis::{ Token, LexError };
4
5mod semantic_analysis;
6pub use semantic_analysis::parse as sem_parse;
7pub use semantic_analysis::SemanticError;
8
9mod syntactic_analysis;
10pub use syntactic_analysis::parse as syn_parse;
11pub use syntactic_analysis::{ Syntax, SyntaxError };
12
13#[cfg(test)]
14mod test;
15
16use crate::s_expression::SExpressionRef;
17use std::error::Error;
18use std::convert::From;
19
20pub fn parse(text: &str) -> Result<SExpressionRef, ParseError> {
21 let tokens = lexical_analysis::parse(text)?;
22 let syntax = syntactic_analysis::parse(tokens)?;
23 let ret = semantic_analysis::parse(syntax)?;
24
25 Ok(ret)
26}
27
28#[derive(Debug)]
29pub enum ParseError {
30 Lex(LexError),
31 Semantic(SemanticError),
32 Syntax(SyntaxError),
33}
34
35impl std::fmt::Display for ParseError {
36 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
37 match self {
38 Self::Lex(err) => write!(f, "{}", err),
39 Self::Syntax(err) => write!(f, "{}", err),
40 Self::Semantic(err) => write!(f, "{}", err),
41 }
42 }
43}
44
45impl From<LexError> for ParseError {
46 fn from(err: LexError) -> Self {
47 Self::Lex(err)
48 }
49}
50
51impl From<SyntaxError> for ParseError {
52 fn from(err: SyntaxError) -> Self {
53 Self::Syntax(err)
54 }
55}
56
57impl From<SemanticError> for ParseError {
58 fn from(err: SemanticError) -> Self {
59 Self::Semantic(err)
60 }
61}
62
63impl Error for ParseError { }