/*
 * Copyright 2004-2019 H2 Group. Multiple-Licensed under the MPL 2.0,
 * and the EPL 1.0 (http://h2database.com/html/license.html).
 * Initial Developer: H2 Group
 */
package org.h2.bnf;

import java.util.ArrayList;
import java.util.HashMap;

import org.h2.util.Utils;

Represents a sequence of BNF rules, or a list of alternative rules.
/** * Represents a sequence of BNF rules, or a list of alternative rules. */
public class RuleList implements Rule { private final boolean or; private final ArrayList<Rule> list; private boolean mapSet; public RuleList(Rule first, Rule next, boolean or) { list = Utils.newSmallArrayList(); if (first instanceof RuleList && ((RuleList) first).or == or) { list.addAll(((RuleList) first).list); } else { list.add(first); } if (next instanceof RuleList && ((RuleList) next).or == or) { list.addAll(((RuleList) next).list); } else { list.add(next); } this.or = or; } @Override public void accept(BnfVisitor visitor) { visitor.visitRuleList(or, list); } @Override public void setLinks(HashMap<String, RuleHead> ruleMap) { if (!mapSet) { for (Rule r : list) { r.setLinks(ruleMap); } mapSet = true; } } @Override public boolean autoComplete(Sentence sentence) { sentence.stopIfRequired(); String old = sentence.getQuery(); if (or) { for (Rule r : list) { sentence.setQuery(old); if (r.autoComplete(sentence)) { return true; } } return false; } for (Rule r : list) { if (!r.autoComplete(sentence)) { sentence.setQuery(old); return false; } } return true; } }