nyavascript/parse/
mod.rs

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 { }