blob: 2047d842f23bb10097f8cd403c971f076485a576 [file] [log] [blame]
package org.eclipse.gymnast.generators.ecore.cst;
import java.util.List;
import java.util.Map;
import org.eclipse.gymnast.generator.core.ast.AltRule;
import org.eclipse.gymnast.generator.core.ast.CompUnit;
import org.eclipse.gymnast.generator.core.ast.HeaderSection;
import org.eclipse.gymnast.generator.core.ast.ListRule;
import org.eclipse.gymnast.generator.core.ast.Seq;
import org.eclipse.gymnast.generator.core.ast.SeqRule;
import org.eclipse.gymnast.generator.core.ast.SimpleExpr;
import org.eclipse.gymnast.generator.core.ast.TokenRule;
import org.eclipse.gymnast.generators.ecore.walker.GymnastSwitch;
/**
*
* If this visitor is invoked with a <code>GymnastWalker</code> on the
* <code>compUnit</code> ("root") production, only reachable rules will be
* visited.
*
*
* @author Miguel Garcia, http://www.sts.tu-harburg.de/~mi.garcia/
*
*/
public class GymnastCollector extends GymnastSwitch<Object> {
public final RootCS c;
public GymnastCollector(RootCS c) {
this.c = c;
}
public Object handleAltRule(AltRule ar, String name, List<String> alts, List<String> attrs,
List<Object> resPreSeqs, List<Object> resPostSeqs) {
AltRuleCS arc = new AltRuleCS(name, alts, attrs, c, ar);
c.altRules.add(arc);
for (Object object : resPreSeqs) {
SeqExprCS sec = (SeqExprCS) object;
arc.preSeq.add(sec);
}
for (Object object : resPostSeqs) {
SeqExprCS sec = (SeqExprCS) object;
arc.postSeq.add(sec);
}
return null;
}
public Object handleHeader(HeaderSection headerSection, String languageName, Map<String, String> resOptions) {
c.languageName = languageName;
c.options = resOptions;
return null;
}
public Object handleListRule(ListRule lr, List<String> attrs, String name, String e1, String separator,
String opt_e2, int lowerBound, String opt_FieldName1, String opt_FieldName2) {
ListRuleCS lrc = new ListRuleCS(name, e1, separator, opt_e2, lowerBound, opt_FieldName1, opt_FieldName2, c, lr);
c.listRules.add(lrc);
return null;
}
public Object handleSeqRule(SeqRule sr, String name, List<String> attrs, List<Object> resSeqExprs) {
SeqRuleCS src = new SeqRuleCS(name, attrs, c, sr);
int position = 0;
for (Object object : resSeqExprs) {
SeqExprCS sec = (SeqExprCS) object;
src.seqexprs.add(sec);
sec.srCS = src;
sec.position = position;
position++;
}
c.seqRules.add(src);
return null;
}
public Object handleSimpleExprInRule(SeqRule sr, SimpleExpr se, boolean isOptional, String optFieldName,
String value, List<String> attrs, int position) {
SeqExprCS sec = new SeqExprCS(isOptional, optFieldName, value, position, c);
return sec;
}
public Object handleTokenRule(TokenRule tr, String name, List<String> attrs, List<String> alts) {
TokenRuleCS trc = new TokenRuleCS(name, alts, attrs, c, tr);
c.tokenRules.add(trc);
return null;
}
@Override
public Object handleSimpleExprInPreOrPostInAltRule(AltRule ar, SimpleExpr se, boolean isOptional,
String optFieldName, String value, List<String> attrs, int size) {
SeqExprCS sec = new SeqExprCS(isOptional, optFieldName, value, -1, c);
return sec;
}
private void distributePreAndPostSeqInAltRulesRules() {
if (!c.isWellFormed()) {
return;
}
for (AltRuleCS arCS : c.altRules) {
if (!arCS.preSeq.isEmpty() || !arCS.preSeq.isEmpty()) {
arCS.distributePreAndPostSeqToConstituentSeqRules();
}
}
}
@Override
public Object handleRoot(CompUnit root, Object resHeader, Object resGrammar) {
distributePreAndPostSeqInAltRulesRules();
return null;
}
}