package org.scribble.parser.ast.global; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.AstFactoryImpl; import org.scribble.ast.global.GProtocolDecl; import org.scribble.ast.global.GProtocolDef; import org.scribble.ast.global.GProtocolHeader; import org.scribble.parser.ScribParser; import org.scribble.util.ScribParserException; public class AntlrGProtocolDecl { public static final int HEADER_CHILD_INDEX = 0; public static final int BODY_CHILD_INDEX = 1; //public static final int EXPLICIT_CONNECTIONS_FLAG_INDEX = 2; public static final int MODIFIERS_CHILD_INDEX = 2; public static GProtocolDecl parseGPrototocolDecl(ScribParser parser, CommonTree ct) throws ScribParserException { GProtocolHeader header = (GProtocolHeader) parser.parse(getHeaderChild(ct)); GProtocolDef def = (GProtocolDef) parser.parse(getBodyChild(ct)); List<GProtocolDecl.Modifiers> modifiers = new LinkedList<>(); /*if (isExplicitConnections(ct)) { modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); }*/ if (hasModifiersChild(ct)) { for (CommonTree mod :getModifierChildren(ct)) { switch (mod.getText()) { case "aux": modifiers.add(GProtocolDecl.Modifiers.AUX); break; case "explicit": modifiers.add(GProtocolDecl.Modifiers.EXPLICIT); break; default: throw new RuntimeException("TODO: " + mod); } } } return AstFactoryImpl.FACTORY.GProtocolDecl(ct, modifiers, header, def); } public static CommonTree getHeaderChild(CommonTree ct) { return (CommonTree) ct.getChild(HEADER_CHILD_INDEX); } public static CommonTree getBodyChild(CommonTree ct) { return (CommonTree) ct.getChild(BODY_CHILD_INDEX); } public static boolean hasModifiersChild(CommonTree ct) { return ct.getChildCount() > MODIFIERS_CHILD_INDEX; } public static List<CommonTree> getModifierChildren(CommonTree ct) { //return (CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX); return ((List<?>) ((CommonTree) ct.getChild(MODIFIERS_CHILD_INDEX)).getChildren()).stream() .map((c) -> (CommonTree) c).collect(Collectors.toList()); } /*public static boolean isExplicitConnections(CommonTree ct) { return ct.getChildCount() > EXPLICIT_CONNECTIONS_FLAG_INDEX; }*/ }