git.delta.rocks / jrsonnet / refs/commits / 2edd59dfdd9f

difftreelog

feat(parser) slice desugaring

Лач2020-06-14parent: #c08e7d8.patch.diff
in: master

1 file changed

modifiedcrates/jsonnet-parser/src/lib.rsdiffbeforeafterboth
192192
193 / l(s,<keyword("error") _ expr:expr(s) { Expr::Error(expr) }>)193 / l(s,<keyword("error") _ expr:expr(s) { Expr::Error(expr) }>)
194194
195 rule slice_part(s: &ParserSettings) -> Option<LocExpr>
196 = e:(_ e:expr(s) _{e})? {e}
195 pub rule slice_desc(s: &ParserSettings) -> SliceDesc197 pub rule slice_desc(s: &ParserSettings) -> SliceDesc
196 = start:expr(s)? _ ":" _ pair:(end:expr(s)? _ step:(":" _ e:expr(s) {e})? {(end, step)})? {198 = start:slice_part(s) ":" pair:(end:slice_part(s) ":" step:slice_part(s) {(end, step)})? {
197 if let Some((end, step)) = pair {199 let (end, step) = if let Some((end, step)) = pair {
198 SliceDesc { start, end, step }200 (end, step)
199 }else{201 }else{
202 (None, None)
203 };
204
200 SliceDesc { start, end: None, step: None }205 SliceDesc { start, end, step }
201 }
202 }206 }
203207
204 rule expr(s: &ParserSettings) -> LocExpr208 rule expr(s: &ParserSettings) -> LocExpr
262 "!" _ b:@ {loc_expr_todo!(Expr::UnaryOp(UnaryOpType::Not, b))}266 "!" _ b:@ {loc_expr_todo!(Expr::UnaryOp(UnaryOpType::Not, b))}
263 "~" _ b:@ { loc_expr_todo!(Expr::UnaryOp(UnaryOpType::BitNot, b)) }267 "~" _ b:@ { loc_expr_todo!(Expr::UnaryOp(UnaryOpType::BitNot, b)) }
264 --268 --
265 a:(@) _ "[" _ s:slice_desc(s) _ "]" {loc_expr_todo!(Expr::Slice(a, s))}269 a:(@) _ "[" _ s:slice_desc(s) _ "]" {loc_expr_todo!(Expr::Apply(
270 el!(Expr::Index(
271 el!(Expr::Var("std".to_owned())),
272 el!(Expr::Str("slice".to_owned())),
273 )),
274 ArgsDesc(vec![
275 Arg(None, a),
276 Arg(None, s.start.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),
277 Arg(None, s.end.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),
278 Arg(None, s.step.unwrap_or_else(||el!(Expr::Literal(LiteralType::Null)))),
279 ]),
280 true,
281 ))}
266 a:(@) _ "." _ s:id() {loc_expr_todo!(Expr::Index(a, el!(Expr::Str(s))))}282 a:(@) _ "." _ s:id() {loc_expr_todo!(Expr::Index(a, el!(Expr::Str(s))))}
267 a:(@) _ "[" _ s:expr(s) _ "]" {loc_expr_todo!(Expr::Index(a, s))}283 a:(@) _ "[" _ s:expr(s) _ "]" {loc_expr_todo!(Expr::Index(a, s))}
339 )355 )
340 }356 }
357
358 #[test]
359 fn slice() {
360 println!("{:?}", parse!("a[1:]"));
361 println!("{:?}", parse!("a[1::]"));
362 println!("{:?}", parse!("a[:1:]"));
363 println!("{:?}", parse!("a[::1]"));
364 }
341365
342 #[test]366 #[test]
343 fn string_escaping() {367 fn string_escaping() {