// Path: src/main/java/txr/parser/Expr.java
// public class Expr extends Node {
// 
// 	public final List<SubExpression> subExpressions;
// 	
// 	public Expr(List<SubExpression> subExpressions) {
// 		this.subExpressions = subExpressions;
// 	}
// 
// 	@Override
// 	public boolean isNegativeMatcher() {
// 		return false;
// 	}
// 
// 	public String toString() {
// 		return subExpressions.toString();
// 	}
// }
// 
// Path: src/main/java/txr/parser/Symbol.java
// public class Symbol extends SubExpression {
// 
// 	public final String symbolText;
// 	
// 	public Symbol(String symbolText) {
// 		this.symbolText = symbolText;
// 	}
// 
// 	public String toString() {
// 		return "Symbol: " + symbolText;
// 	}
// }


import java.util.ArrayList;
import java.util.List;
import txr.parser.Expr;
import txr.parser.Symbol;
		}

		Long times = keywordValues.removeInteger(":times");
		if (times != null) {
			if (mintimes != null || maxtimes != null) {
				throw new RuntimeException("You cannot specify :times if you have also specified either or both :mintimes and :maxtimes");
			}
			mintimes = times;
			maxtimes = times;
		}

		keywordValues.failIfUnusedKeywords();
	}

	@Override
	public void addNextMatcherInMatchSequence(Matcher matcher) {
		switch (where) {
		case BODY:
			body.addNextMatcherInMatchSequence(matcher);
			break;
		case UNTIL:
			until.addNextMatcherInMatchSequence(matcher);
			break;
		case LAST:
			last.addNextMatcherInMatchSequence(matcher);
			break;
		}
	}

	@Override
// Path: src/main/java/txr/parser/Expr.java
// public class Expr extends Node {
// 
// 	public final List<SubExpression> subExpressions;
// 	
// 	public Expr(List<SubExpression> subExpressions) {
// 		this.subExpressions = subExpressions;
// 	}
// 
// 	@Override
// 	public boolean isNegativeMatcher() {
// 		return false;
// 	}
// 
// 	public String toString() {
// 		return subExpressions.toString();
// 	}
// }
// 
// Path: src/main/java/txr/parser/Symbol.java
// public class Symbol extends SubExpression {
// 
// 	public final String symbolText;
// 	
// 	public Symbol(String symbolText) {
// 		this.symbolText = symbolText;
// 	}
// 
// 	public String toString() {
// 		return "Symbol: " + symbolText;
// 	}
// }


// Path: src/main/java/txr/matchers/CollectMatcher.java
import java.util.ArrayList;
import java.util.List;
import txr.parser.Expr;
import txr.parser.Symbol;

		}

		Long times = keywordValues.removeInteger(":times");
		if (times != null) {
			if (mintimes != null || maxtimes != null) {
				throw new RuntimeException("You cannot specify :times if you have also specified either or both :mintimes and :maxtimes");
			}
			mintimes = times;
			maxtimes = times;
		}

		keywordValues.failIfUnusedKeywords();
	}

	@Override
	public void addNextMatcherInMatchSequence(Matcher matcher) {
		switch (where) {
		case BODY:
			body.addNextMatcherInMatchSequence(matcher);
			break;
		case UNTIL:
			until.addNextMatcherInMatchSequence(matcher);
			break;
		case LAST:
			last.addNextMatcherInMatchSequence(matcher);
			break;
		}
	}

	@Override
	public void addNextDirective(int txrLineIndex, Expr expr) {