private RouteAST Route() { Eat(TokenType.ROUTE); AST definition = Inherit(); Eat(TokenType.LPAR); RouteParamsAST routeParamsAST; if (currentToken.Type != TokenType.SEMIC) { routeParamsAST = RouteParameters(); } else { routeParamsAST = new RouteParamsAST(new List <RouteParamAST>()); } Eat(TokenType.SEMIC); RouteInPortAST inPortAST; if (currentToken.Type != TokenType.SEMIC) { inPortAST = RouteInPorts(); } else { inPortAST = new RouteInPortAST(new List <AST>()); } Eat(TokenType.SEMIC); RoutePortAST outPortAST; if (currentToken.Type != TokenType.RPAR) { outPortAST = RoutePorts(); } else { outPortAST = new RoutePortAST(new List <WordAST>()); } Eat(TokenType.RPAR); StatementsAST statementsAST = Statements(); Eat(TokenType.END); return(new RouteAST(definition, routeParamsAST, inPortAST, outPortAST, statementsAST)); }
private List <RouteInPort> Visit(RouteInPortAST routeInPortAST) { return(routeInPortAST.Ports.ConvertAll(routePort => { switch (Visit(routePort)) { case string name: return new RouteInPort() { Name = name, Nullable = false }; case RouteInPort routeInPort: return routeInPort; default: throw logger.Error(new SemanticException(routePort.FindToken(), "Unknown type for in port.")); } })); }