| 194 | } |
| 195 | |
| 196 | pub fn parse(mut self, source: &str) -> Result<IdedExpr, ParseErrors> { |
| 197 | let parse_errors = Rc::new(RefCell::new(Vec::<ParseError>::new())); |
| 198 | let stream = InputStream::new(source); |
| 199 | let mut lexer = gen::CELLexer::new(stream); |
| 200 | lexer.remove_error_listeners(); |
| 201 | lexer.add_error_listener(Box::new(ParserErrorListener { |
| 202 | parse_errors: parse_errors.clone(), |
| 203 | })); |
| 204 | |
| 205 | // todo! might want to avoid this cloning here... |
| 206 | self.helper.source_info.source = source.into(); |
| 207 | |
| 208 | let mut prsr = gen::CELParser::new(CommonTokenStream::new(lexer)); |
| 209 | prsr.remove_error_listeners(); |
| 210 | prsr.add_error_listener(Box::new(ParserErrorListener { |
| 211 | parse_errors: parse_errors.clone(), |
| 212 | })); |
| 213 | prsr.add_parse_listener(Box::new(RecursionListener { |
| 214 | max: self.max_recursion_depth, |
| 215 | depth: 0, |
| 216 | })); |
| 217 | let r = match prsr.start() { |
| 218 | Ok(t) => Ok(self.visit(t.deref())), |
| 219 | Err(e) => Err(ParseError { |
| 220 | source: Some(Box::new(e)), |
| 221 | pos: (0, 0), |
| 222 | msg: "UNKNOWN".to_string(), |
| 223 | expr_id: 0, |
| 224 | source_info: None, |
| 225 | }), |
| 226 | }; |
| 227 | |
| 228 | let info = self.helper.source_info; |
| 229 | let source_info = Arc::new(info); |
| 230 | |
| 231 | let mut errors = parse_errors.take(); |
| 232 | errors.extend(self.errors); |
| 233 | errors.sort_by_key(|a| a.pos); |
| 234 | |
| 235 | if errors.is_empty() { |
| 236 | r.map_err(|e| ParseErrors { errors: vec![e] }) |
| 237 | } else { |
| 238 | Err(ParseErrors { |
| 239 | errors: errors |
| 240 | .into_iter() |
| 241 | .map(|mut e: ParseError| { |
| 242 | e.source_info = Some(source_info.clone()); |
| 243 | e |
| 244 | }) |
| 245 | .collect(), |
| 246 | }) |
| 247 | } |
| 248 | } |
| 249 | |
| 250 | fn field_initializer_list( |
| 251 | &mut self, |