Skip to main content

algebraeon_geometry/parse/
mod.rs

1use crate::partial_simplicial_complex::PartialSimplicialComplex;
2use algebraeon_nzq::RationalCanonicalStructure;
3use lalrpop_util::lalrpop_mod;
4
5lalrpop_mod!(shape_parser, "/parse/shape_grammar.rs");
6mod ast;
7
8pub fn parse_shape(string: &str) -> PartialSimplicialComplex<'static, RationalCanonicalStructure> {
9    shape_parser::ShapeParser::new()
10        .parse(string)
11        .unwrap()
12        .to_partial_simplicial_complex_root()
13}
14
15#[cfg(test)]
16mod tests {
17    use crate::parse::ast::{Point, SignedValue};
18
19    use super::*;
20
21    #[test]
22    fn test() {
23        assert_eq!(
24            shape_parser::PointParser::new()
25                .parse("(6, +7, -8, + 9, - 10)")
26                .unwrap(),
27            Point {
28                coordinates: vec![
29                    SignedValue {
30                        sign: ast::Sign::Positive,
31                        value: String::from("6")
32                    },
33                    SignedValue {
34                        sign: ast::Sign::Positive,
35                        value: String::from("7")
36                    },
37                    SignedValue {
38                        sign: ast::Sign::Negative,
39                        value: String::from("8")
40                    },
41                    SignedValue {
42                        sign: ast::Sign::Positive,
43                        value: String::from("9")
44                    },
45                    SignedValue {
46                        sign: ast::Sign::Negative,
47                        value: String::from("10")
48                    }
49                ]
50            }
51        );
52
53        assert!(
54            shape_parser::ShapeParser::new()
55                .parse("ConvexHull((),(),)")
56                .is_ok()
57        );
58        assert!(
59            shape_parser::ShapeParser::new()
60                .parse("ConvexHull((),())")
61                .is_ok()
62        );
63        assert!(
64            shape_parser::ShapeParser::new()
65                .parse("ConvexHull((),)")
66                .is_ok()
67        );
68        assert!(
69            shape_parser::ShapeParser::new()
70                .parse("ConvexHull(())")
71                .is_ok()
72        );
73        assert!(
74            shape_parser::ShapeParser::new()
75                .parse("ConvexHull()")
76                .is_ok()
77        );
78        assert!(
79            shape_parser::ShapeParser::new()
80                .parse("ConvexHull() | ConvexHull()")
81                .is_ok()
82        );
83        assert!(
84            shape_parser::ShapeParser::new()
85                .parse("ConvexHull() | ConvexHull() |)")
86                .is_err()
87        );
88        assert!(
89            shape_parser::ShapeParser::new()
90                .parse("ConvexHull() | ConvexHull() | ConvexHull()")
91                .is_ok()
92        );
93        assert!(
94            shape_parser::ShapeParser::new()
95                .parse("ConvexHull() & ConvexHull()")
96                .is_ok()
97        );
98        assert!(
99            shape_parser::ShapeParser::new()
100                .parse("ConvexHull() & ConvexHull() &")
101                .is_err()
102        );
103        assert!(
104            shape_parser::ShapeParser::new()
105                .parse("ConvexHull() & ConvexHull() & ConvexHull()")
106                .is_ok()
107        );
108        assert!(
109            shape_parser::ShapeParser::new()
110                .parse("ConvexHull() | ConvexHull() & ConvexHull()")
111                .is_err()
112        );
113        assert!(
114            shape_parser::ShapeParser::new()
115                .parse("ConvexHull() & ConvexHull() | ConvexHull()")
116                .is_err()
117        );
118        assert!(
119            shape_parser::ShapeParser::new()
120                .parse("ConvexHull() \\ ConvexHull()")
121                .is_ok()
122        );
123        assert!(
124            shape_parser::ShapeParser::new()
125                .parse("ConvexHull() \\ ConvexHull() \\ ConvexHull()")
126                .is_err()
127        );
128        assert!(
129            shape_parser::ShapeParser::new()
130                .parse("ConvexHull() \\ ConvexHull() | ConvexHull()")
131                .is_err()
132        );
133        assert!(
134            shape_parser::ShapeParser::new()
135                .parse("(ConvexHull() \\ ConvexHull()) | ConvexHull()")
136                .is_ok()
137        );
138        assert!(
139            shape_parser::ShapeParser::new()
140                .parse("ConvexHull() \\ ConvexHull() & ConvexHull()")
141                .is_err()
142        );
143        assert!(
144            shape_parser::ShapeParser::new()
145                .parse("(ConvexHull() \\ ConvexHull()) & ConvexHull()")
146                .is_ok()
147        );
148    }
149}