Core PEG rule: "Sequence". Matches a list of sub rules in order. All must match, or none do. Probably the most important rule. @param objs rules/string literals/char literals/execs @return sequence rule
(Object... objs)
| 749 | * @return sequence rule |
| 750 | */ |
| 751 | public ParentRule seqOf(Object... objs) { |
| 752 | List<Step> steps = asSteps(objs); |
| 753 | PegLegRule<V> rule; |
| 754 | if (steps.size() == 1 && steps.get(0).isRule()) { |
| 755 | rule = steps.get(0).asRule(); |
| 756 | } else { |
| 757 | rule = () -> { |
| 758 | get().pushFrame("seqOf()"); |
| 759 | SingleNode<V> values = get().saveValues(); |
| 760 | int cnt = get().frameDepth(); |
| 761 | for (Step r : steps) { |
| 762 | if (r.isRule()) { |
| 763 | RuleReturn<V> ret = r.asRule().rule(); |
| 764 | if (!ret.matched()) { |
| 765 | get().rollback(cnt, values); |
| 766 | return get().ruleReturn(false, false); |
| 767 | } |
| 768 | } else { |
| 769 | if (!r.asExec().exec()) { |
| 770 | get().rollback(cnt, values); |
| 771 | return get().ruleReturn(false, false); |
| 772 | } |
| 773 | } |
| 774 | } |
| 775 | get().trimFramesTo(cnt); |
| 776 | return get().ruleReturn(true, true); |
| 777 | }; |
| 778 | } |
| 779 | return new ParentRule(rule); |
| 780 | } |
| 781 | |
| 782 | /** |
| 783 | * Core PEG rule "Choice", here called firstOf. Tries each sub rule in turn, return first match. |