Skip to main content

csmlinterpreter/parser/
parse_var_types.rs

1use crate::data::{ast::*, tokens::*};
2use crate::error_format::{gen_nom_failure, ERROR_RIGHT_BRACKET};
3use crate::parser::{
4    operator::parse_operator,
5    parse_comments::comment,
6    parse_functions::parse_functions,
7    parse_idents::{parse_idents_as, parse_idents_assignation, parse_idents_utilisation},
8    parse_literal::parse_literal_expr,
9    parse_object::parse_object,
10    parse_parenthesis::parse_r_parentheses,
11    parse_path::parse_path,
12    parse_string::parse_string,
13    tools::*,
14};
15
16use nom::{
17    branch::alt,
18    bytes::complete::tag,
19    combinator::{cut, opt},
20    error::ParseError,
21    multi::separated_list,
22    sequence::{delimited, preceded, terminated, tuple},
23    Err, IResult,
24};
25
26////////////////////////////////////////////////////////////////////////////////
27// PRIVATE FUNCTIONS
28////////////////////////////////////////////////////////////////////////////////
29
30fn parse_r_bracket<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Span<'a>, E>
31where
32    E: ParseError<Span<'a>>,
33{
34    match tag(R_BRACKET)(s) {
35        Ok((rest, val)) => Ok((rest, val)),
36        Err(Err::Error((s, _err))) | Err(Err::Failure((s, _err))) => {
37            Err(gen_nom_failure(s, ERROR_RIGHT_BRACKET))
38        }
39        Err(Err::Incomplete(needed)) => Err(Err::Incomplete(needed)),
40    }
41}
42
43fn parse_condition_group<'a, E: ParseError<Span<'a>>>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
44where
45    E: ParseError<Span<'a>>,
46{
47    delimited(
48        preceded(comment, tag(L_PAREN)),
49        parse_operator,
50        preceded(comment, parse_r_parentheses),
51    )(s)
52}
53
54fn parse_idents_expr_utilisation<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
55where
56    E: ParseError<Span<'a>>,
57{
58    let (s, idents) = parse_idents_utilisation(s)?;
59    Ok((s, Expr::IdentExpr(idents)))
60}
61
62fn parse_assignation_without_path<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
63where
64    E: ParseError<Span<'a>>,
65{
66    let (s, name) = parse_idents_assignation(s)?;
67    let (s, _) = preceded(comment, tag(ASSIGN))(s)?;
68    let (s, expr) = preceded(comment, parse_operator)(s)?;
69
70    Ok((
71        s,
72        Expr::ObjectExpr(ObjectType::Assign(
73            Box::new(Expr::IdentExpr(name)),
74            Box::new(expr),
75        )),
76    ))
77}
78
79////////////////////////////////////////////////////////////////////////////////
80// PUBLIC FUNCTIONS
81////////////////////////////////////////////////////////////////////////////////
82
83pub fn parse_expr_list<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
84where
85    E: ParseError<Span<'a>>,
86{
87    let (s, start) = preceded(comment, get_interval)(s)?;
88    let (s, (vec, _)) = preceded(
89        tag(L_PAREN),
90        cut(terminated(
91            tuple((
92                separated_list(
93                    preceded(comment, tag(COMMA)),
94                    alt((parse_assignation_without_path, parse_operator)),
95                ),
96                opt(preceded(comment, tag(COMMA))),
97            )),
98            preceded(comment, parse_r_parentheses),
99        )),
100    )(s)?;
101    let (s, end) = get_interval(s)?;
102
103    Ok((s, Expr::VecExpr(vec, RangeInterval { start, end })))
104}
105
106pub fn parse_expr_array<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
107where
108    E: ParseError<Span<'a>>,
109{
110    let (s, start) = preceded(comment, get_interval)(s)?;
111    let (s, (vec, _)) = preceded(
112        tag(L_BRACKET),
113        cut(terminated(
114            tuple((
115                separated_list(preceded(comment, tag(COMMA)), parse_operator),
116                opt(preceded(comment, tag(COMMA))),
117            )),
118            preceded(comment, parse_r_bracket),
119        )),
120    )(s)?;
121    let (s, end) = get_interval(s)?;
122
123    Ok((s, Expr::VecExpr(vec, RangeInterval { start, end })))
124}
125
126pub fn parse_basic_expr<'a, E>(s: Span<'a>) -> IResult<Span<'a>, Expr, E>
127where
128    E: ParseError<Span<'a>>,
129{
130    let (s, expr) = preceded(
131        comment,
132        alt((
133            parse_condition_group,
134            parse_object,
135            parse_expr_array,
136            parse_literal_expr,
137            parse_functions,
138            parse_string,
139            parse_idents_expr_utilisation,
140        )),
141    )(s)?;
142
143    let (s, expr) = parse_path(s, expr)?;
144
145    parse_idents_as(s, expr)
146}