package org.scribble.parser; import java.util.List; import java.util.stream.Collectors; import org.antlr.runtime.tree.CommonErrorNode; import org.antlr.runtime.tree.CommonTree; import org.scribble.ast.ScribNode; import org.scribble.parser.AntlrConstants.AntlrNodeType; import org.scribble.parser.ast.AntlrDataTypeDecl; import org.scribble.parser.ast.AntlrImportModule; import org.scribble.parser.ast.AntlrMessageSig; import org.scribble.parser.ast.AntlrMessageSigDecl; import org.scribble.parser.ast.AntlrModule; import org.scribble.parser.ast.AntlrModuleDecl; import org.scribble.parser.ast.AntlrNonRoleArgList; import org.scribble.parser.ast.AntlrNonRoleParamDecl; import org.scribble.parser.ast.AntlrNonRoleParamDeclList; import org.scribble.parser.ast.AntlrPayloadElemList; import org.scribble.parser.ast.AntlrRoleArg; import org.scribble.parser.ast.AntlrRoleArgList; import org.scribble.parser.ast.AntlrRoleDecl; import org.scribble.parser.ast.AntlrRoleDeclList; import org.scribble.parser.ast.global.AntlrGChoice; import org.scribble.parser.ast.global.AntlrGConnect; import org.scribble.parser.ast.global.AntlrGContinue; import org.scribble.parser.ast.global.AntlrGDisconnect; import org.scribble.parser.ast.global.AntlrGDo; import org.scribble.parser.ast.global.AntlrGInteractionSequence; import org.scribble.parser.ast.global.AntlrGInterrupt; import org.scribble.parser.ast.global.AntlrGInterruptible; import org.scribble.parser.ast.global.AntlrGMessageTransfer; import org.scribble.parser.ast.global.AntlrGParallel; import org.scribble.parser.ast.global.AntlrGProtocolBlock; import org.scribble.parser.ast.global.AntlrGProtocolDecl; import org.scribble.parser.ast.global.AntlrGProtocolDefinition; import org.scribble.parser.ast.global.AntlrGProtocolHeader; import org.scribble.parser.ast.global.AntlrGRecursion; import org.scribble.parser.ast.global.AntlrGWrap; import org.scribble.parser.util.ScribParserUtil; import org.scribble.util.ScribParserException; // ANTLR CommonTree -> ScribNode // Parses ANTLR nodes into ScribNodes using the parser.ast.Antlr[...] helper classes public class ScribParser { public ScribParser() { } public ScribNode parse(CommonTree ct) throws ScribParserException { if (ct.getChildCount() > 0) // getChildren returns null instead of empty list { List<CommonErrorNode> errors = ((List<?>) ct.getChildren()).stream() .filter((c) -> (c instanceof CommonErrorNode)) .map((c) -> (CommonErrorNode) c) .collect(Collectors.toList()); if (errors.size() > 0) // Antlr prints errors to System.err by default, but then attempts to carry on // Should never get here now, Antlr displayRecognitionError overridden to force exit: Antlr error recovery means not all errors produce CommonErrorNode { //throw new ScribParserException("Parsing errors: " + errors); // FIXME: improve feedback message System.err.println("Aborting due to parsing errors."); System.exit(1); } } AntlrNodeType type = ScribParserUtil.getAntlrNodeType(ct); switch (type) { case MODULE: return AntlrModule.parseModule(this, ct); case MODULEDECL: return AntlrModuleDecl.parseModuleDecl(this, ct); case MESSAGESIGNATUREDECL: return AntlrMessageSigDecl.parseMessageSigDecl(this, ct); case PAYLOADTYPEDECL: return AntlrDataTypeDecl.parseDataTypeDecl(this, ct); case IMPORTMODULE: return AntlrImportModule.parseImportModule(this, ct); case GLOBALPROTOCOLDECL: return AntlrGProtocolDecl.parseGPrototocolDecl(this, ct); case ROLEDECLLIST: return AntlrRoleDeclList.parseRoleDeclList(this, ct); case ROLEDECL: return AntlrRoleDecl.parseRoleDecl(this, ct); /*case CONNECTDECL: return AntlrConnectDecl.parseConnectDecl(this, ct);*/ case PARAMETERDECLLIST: //case EMPTY_PARAMETERDECLLST: return AntlrNonRoleParamDeclList.parseNonRoleParamDeclList(this, ct); case PARAMETERDECL: return AntlrNonRoleParamDecl.parseNonRoleParamDecl(this, ct); case GLOBALPROTOCOLHEADER: return AntlrGProtocolHeader.parseGProtocolHeader(this, ct); case GLOBALPROTOCOLDEF: return AntlrGProtocolDefinition.parseGProtocolDefinition(this, ct); case GLOBALPROTOCOLBLOCK: return AntlrGProtocolBlock.parseGProtocolBlock(this, ct); case GLOBALINTERACTIONSEQUENCE: return AntlrGInteractionSequence.parseGInteractionSequence(this, ct); case MESSAGESIGNATURE: return AntlrMessageSig.parseMessageSig(this, ct); case PAYLOAD: return AntlrPayloadElemList.parsePayloadElemList(this, ct); case GLOBALCONNECT: return AntlrGConnect.parseGConnect(this, ct); case GLOBALDISCONNECT: return AntlrGDisconnect.parseGDisconnect(this, ct); case GLOBALMESSAGETRANSFER: return AntlrGMessageTransfer.parseGMessageTransfer(this, ct); case GLOBALCHOICE: return AntlrGChoice.parseGChoice(this, ct); case GLOBALRECURSION: return AntlrGRecursion.parseGRecursion(this, ct); case GLOBALCONTINUE: return AntlrGContinue.parseGContinue(this, ct); case GLOBALPARALLEL: return AntlrGParallel.parseGParallel(this, ct); case GLOBALINTERRUPTIBLE: return AntlrGInterruptible.parseGInterruptible(this, ct); case GLOBALINTERRUPT: return AntlrGInterrupt.parseGInterrupt(this, ct); case GLOBALDO: return AntlrGDo.parseGDo(this, ct); case GLOBALWRAP: return AntlrGWrap.parseGWrap(this, ct); case ROLEINSTANTIATIONLIST: return AntlrRoleArgList.parseRoleArgList(this, ct); case ROLEINSTANTIATION: return AntlrRoleArg.parseRoleArg(this, ct); case ARGUMENTINSTANTIATIONLIST: return AntlrNonRoleArgList.parseNonRoleArgList(this, ct); default: throw new RuntimeException("Unknown ANTLR node type: " + type); } } }