|
497 | 497 | },
|
498 | 498 |
|
499 | 499 | nud: function(token) {
|
| 500 | + var left; |
| 501 | + var right; |
| 502 | + var expression; |
500 | 503 | switch (token.type) {
|
501 | 504 | case "Literal":
|
502 | 505 | return {type: "Literal", value: token.value};
|
503 |
| - break; |
504 | 506 | case "UnquotedIdentifier":
|
505 | 507 | return {type: "Field", name: token.value};
|
506 |
| - break; |
507 | 508 | case "QuotedIdentifier":
|
508 | 509 | var node = {type: "Field", name: token.value};
|
509 | 510 | if (this.lookahead(0) === "Lparen") {
|
|
513 | 514 | }
|
514 | 515 | break;
|
515 | 516 | case "Not":
|
516 |
| - var right = this.expression(this.bindingPower.Not); |
| 517 | + right = this.expression(this.bindingPower.Not); |
517 | 518 | return {type: "NotExpression", children: [right]};
|
518 |
| - break; |
519 | 519 | case "Star":
|
520 |
| - var left = {type: "Identity"}; |
521 |
| - var right = null; |
| 520 | + left = {type: "Identity"}; |
| 521 | + right = null; |
522 | 522 | if (this.lookahead(0) === "Rbracket") {
|
523 | 523 | // This can happen in a multiselect,
|
524 | 524 | // [a, b, *]
|
|
527 | 527 | right = this.parseProjectionRHS(this.bindingPower.Star);
|
528 | 528 | }
|
529 | 529 | return {type: "ValueProjection", children: [left, right]};
|
530 |
| - break; |
531 | 530 | case "Filter":
|
532 | 531 | return this.led(token.type, {type: "Identity"});
|
533 |
| - break; |
534 | 532 | case "Lbrace":
|
535 | 533 | return this.parseMultiselectHash();
|
536 |
| - break; |
537 | 534 | case "Flatten":
|
538 |
| - var left = {type: "Flatten", children: [{type: "Identity"}]}; |
539 |
| - var right = this.parseProjectionRHS(this.bindingPower.Flatten); |
| 535 | + left = {type: "Flatten", children: [{type: "Identity"}]}; |
| 536 | + right = this.parseProjectionRHS(this.bindingPower.Flatten); |
540 | 537 | return {type: "Projection", children: [left, right]};
|
541 |
| - break; |
542 | 538 | case "Lbracket":
|
543 |
| - var right; |
544 | 539 | if (this.lookahead(0) === "Number" || this.lookahead(0) === "Colon") {
|
545 | 540 | right = this.parseIndexExpression();
|
546 | 541 | return this.projectIfSlice({type: "Identity"}, right);
|
|
557 | 552 | break;
|
558 | 553 | case "Current":
|
559 | 554 | return {type: "Current"};
|
560 |
| - break; |
561 | 555 | case "Expref":
|
562 |
| - var expression = this.expression(this.bindingPower.Expref); |
| 556 | + expression = this.expression(this.bindingPower.Expref); |
563 | 557 | return {type: "ExpressionReference", children: [expression]};
|
564 |
| - break; |
565 | 558 | case "Lparen":
|
566 | 559 | var args = [];
|
567 |
| - var expression; |
568 | 560 | while (this.lookahead(0) !== "Rparen") {
|
569 | 561 | if (this.lookahead(0) === "Current") {
|
570 | 562 | expression = {type: "Current"};
|
|
576 | 568 | }
|
577 | 569 | this.match("Rparen");
|
578 | 570 | return args[0];
|
579 |
| - break; |
580 | 571 | default:
|
581 | 572 | this.errorToken(token);
|
582 |
| - break; |
583 | 573 | }
|
584 | 574 | },
|
585 | 575 |
|
586 | 576 | led: function(tokenName, left) {
|
| 577 | + var right; |
587 | 578 | switch(tokenName) {
|
588 | 579 | case "Dot":
|
589 | 580 | var rbp = this.bindingPower.Dot;
|
590 |
| - var right; |
591 | 581 | if (this.lookahead(0) !== "Star") {
|
592 | 582 | right = this.parseDotRHS(rbp);
|
593 | 583 | return {type: "Subexpression", children: [left, right]};
|
|
599 | 589 | }
|
600 | 590 | break;
|
601 | 591 | case "Pipe":
|
602 |
| - var right = this.expression(this.bindingPower.Pipe); |
| 592 | + right = this.expression(this.bindingPower.Pipe); |
603 | 593 | return {type: "Pipe", children: [left, right]};
|
604 |
| - break; |
605 | 594 | case "Or":
|
606 |
| - var right = this.expression(this.bindingPower.Or); |
| 595 | + right = this.expression(this.bindingPower.Or); |
607 | 596 | return {type: "OrExpression", children: [left, right]};
|
608 |
| - break; |
609 | 597 | case "And":
|
610 |
| - var right = this.expression(this.bindingPower.And); |
| 598 | + right = this.expression(this.bindingPower.And); |
611 | 599 | return {type: "AndExpression", children: [left, right]};
|
612 |
| - break; |
613 | 600 | case "Lparen":
|
614 | 601 | var name = left.name;
|
615 | 602 | var args = [];
|
|
629 | 616 | this.match("Rparen");
|
630 | 617 | node = {type: "Function", name: name, children: args};
|
631 | 618 | return node;
|
632 |
| - break; |
633 | 619 | case "Filter":
|
634 | 620 | var condition = this.expression(0);
|
635 |
| - var right; |
636 | 621 | this.match("Rbracket");
|
637 | 622 | if (this.lookahead(0) === "Flatten") {
|
638 | 623 | right = {type: "Identity"};
|
639 | 624 | } else {
|
640 | 625 | right = this.parseProjectionRHS(this.bindingPower.Filter);
|
641 | 626 | }
|
642 | 627 | return {type: "FilterProjection", children: [left, right, condition]};
|
643 |
| - break; |
644 | 628 | case "Flatten":
|
645 | 629 | var leftNode = {type: "Flatten", children: [left]};
|
646 | 630 | var rightNode = this.parseProjectionRHS(this.bindingPower.Flatten);
|
647 | 631 | return {type: "Projection", children: [leftNode, rightNode]};
|
648 |
| - break; |
649 | 632 | case "EQ":
|
650 | 633 | case "NE":
|
651 | 634 | case "GT":
|
652 | 635 | case "GTE":
|
653 | 636 | case "LT":
|
654 | 637 | case "LTE":
|
655 | 638 | return this.parseComparator(left, tokenName);
|
656 |
| - break |
657 | 639 | case "Lbracket":
|
658 | 640 | var token = this.lookaheadToken(0);
|
659 |
| - var right; |
660 | 641 | if (token.type === "Number" || token.type === "Colon") {
|
661 | 642 | right = this.parseIndexExpression();
|
662 | 643 | return this.projectIfSlice(left, right);
|
|
0 commit comments