org.h2.bnf.RuleList Maven / Gradle / Ivy
/*
* Copyright 2004-2022 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (https://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.
*/
public class RuleList implements Rule {
final boolean or;
final ArrayList 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 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;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
for (int i = 0, l = list.size(); i < l; i++) {
if (i > 0) {
if (or) {
builder.append(" | ");
} else {
builder.append(' ');
}
}
builder.append(list.get(i).toString());
}
return builder.toString();
}
}