public override Verb CreateVerb(string[] tokens) { var type = tokens[2]; var name = tokens[4]; Color(position, tokens[1].Length, Whitespaces); Color(type.Length, KeyWords); Color(tokens[3].Length, Whitespaces); Color(name.Length, Operators); Color(tokens[5].Length, Structures); var index = position + length; var parametersParser = new ParametersParser(); var parsed = parametersParser.Parse(source, index); parsed.If(out var parameters, out index).Must().BeTrue().OrThrow("Operator parser", () => "Parameters malformed"); if (functionBodyParser.Parse(source, index).If(out var block, out var newIndex)) { overridePosition = newIndex; var lambda = new Lambda(new Region(), block, parameters, false); var affinity = 0; var pre = false; switch (type) { case "nofix": affinity = 0; break; case "prefix": affinity = 1; pre = true; break; case "postfix": affinity = 1; break; case "infix": affinity = 2; break; } var userDefinedOperator = new UserDefinedOperator(affinity, pre, lambda); CompilerState.RegisterOperator(name, userDefinedOperator); return(new NullOp()); } return(null); }
public override Verb CreateVerb(string[] tokens) { Color(position, length, Structures); var index = NextPosition; var stack = new Stack <Parameters>(); stack.Push(firstParameters); while (index < source.Length) { if (parametersParser.Parse(source, index).If(out var parameters, out var i)) { index = i; stack.Push(parameters); if (freeParser.Scan(source, index, pattern)) { index = freeParser.Position; freeParser.ColorAll(Structures); continue; } break; } } if (index < source.Length && functionBodyParser.Parse(source, index).If(out var block, out var j)) { var anyLambda = none <Lambda>(); while (stack.Count > 0) { var parameters = stack.Pop(); anyLambda = anyLambda.Map(l => getLambda(parameters, l)).DefaultTo(() => new Lambda(new Region(), block, parameters, false)).Some(); } if (anyLambda.If(out var lambda)) { overridePosition = j; return(new CreateFunction(functionName, lambda, false, visibility, overriding, null) { Index = position }); } } return(null); }
public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); Color(tokens[2].Length, Structures); if (functionBodyParser.Parse(source, NextPosition).If(out var block, out var index)) { overridePosition = index; var staticBlock = new Block { new CreateFunction("__$init", new Lambda(new Region(), block, new Parameters(), false), false, Protected, false, null) }; AddStaticBlock(staticBlock); return(new NullOp()); } return(null); }
public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); var macroName = tokens[2]; Color(macroName.Length, Variables); Color(tokens[3].Length, Structures); var parametersParser = new ParametersParser(); if (parametersParser.Parse(source, NextPosition).If(out var parameters, out var index) && bodyParser.Parse(source, index).If(out var block, out var newIndex)) { var parameterBlock = new ParameterBlock(parameters, block, parameters.Splatting); overridePosition = newIndex; return(new CreateMacro(macroName, parameterBlock)); } return(null); }
public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); var name = tokens[2]; Color(name.Length, Variables); Color(tokens[3].Length, Structures); var parametersParser = new ParametersParser(); if (parametersParser.Parse(source, NextPosition).If(out var parameters, out var i) && functionBodyParser.Parse(source, i).If(out var block, out var j)) { overridePosition = j; return(new CreatePseudoRecursion(name, parameters, block) { Index = position }); } return(null); }
public override Verb CreateVerb(string[] tokens) { var whitespaces = tokens[1]; statementIndex = position + whitespaces.Length; var tokens2Length = tokens[2].Length; var visibilityName = tokens[2].Trim(); visibility = ParseVisibility(visibilityName); var tokens3Length = tokens[3].Length; @override = tokens3Length > 0; var tokens4Length = tokens[4].Length; var memoize = tokens4Length > 0; var tokens5Length = tokens[5].Length; var type = tokens[5].Trim(); var tokens6Length = tokens[6].Length; functionName = LongToMangledPrefix(type, tokens[6].Trim()); var parameterType = tokens[7]; var parametersType = parameterType switch { "(" => ParametersType.Standard, "[" => ParametersType.Pattern, _ => ParametersType.Message }; var xMethod = false; var isDef = true; lockedDown = false; var isInit = false; var isCoFunc = false; switch (type) { case "cofunc": isCoFunc = true; break; case "xfunc": xMethod = true; break; case "pure": lockedDown = true; break; case "init": isDef = false; isInit = true; break; } if (lockedDown) { type.Must().Not.Equal("set").OrThrow(VerboseName, () => "Setters not allowed in views"); } if (InClassDefinition) { xMethod.Must().Not.BeTrue().OrThrow(VerboseName, () => "xfunc not allowed inside class definitions"); } else { visibilityName.Must().BeEmpty() .OrThrow(VerboseName, () => $"Visibility specifier {visibility} not allowed allowed outside of class definition"); isDef.Must().BeTrue().OrThrow(VerboseName, () => $"{type} specifier not allowed outside of a class definition"); } Color(position, whitespaces.Length, Whitespaces); Color(tokens2Length, KeyWords); Color(tokens3Length, KeyWords); Color(tokens4Length, KeyWords); Color(tokens5Length, KeyWords); var invokable = parametersType == ParametersType.Standard || parametersType == ParametersType.Pattern; var entityType = invokable ? Invokeables : Messaging; Color(tokens6Length, entityType); Color(parameterType.Length, Structures); var index = NextPosition; var parametersParser = new ParametersParser(parametersType); if (parametersParser.Parse(source, index).If(out parameters, out index)) { if (source.Drop(index).Keep(1) == "(") { var curriedFunctionParser = new CurriedFunctionParser(functionName, parameters, visibility, @override); if (curriedFunctionParser.Scan(source, index)) { overridePosition = curriedFunctionParser.Position; return(curriedFunctionParser.Verb); } } } else { var builder = new StringBuilder(); var messageParameterParser = new MessageParameterParser(); var variableParser = new VariableParser(); var parameterList = new List <Parameter>(); if (variableParser.Scan(source, index)) { var variable = (Variable)variableParser.Value; var parameter = new Parameter(variable.Name); builder.Append(functionName); builder.Append("_"); parameterList.Add(parameter); index = variableParser.Position; } else { return(null); } while (messageParameterParser.Scan(source, index)) { var parameter = new Parameter(messageParameterParser.ParameterName); parameterList.Add(parameter); builder.Append(messageParameterParser.MessageName); builder.Append("_"); index = messageParameterParser.Result.Position; } functionName = builder.ToString(); parameters = new Parameters(parameterList); } parameters.Must().Not.BeNull().OrThrow(VerboseName, () => "Parameters malformed"); var currying = parametersParser.Currying; functionBodyParser.ExtractCondition = parametersType == ParametersType.Pattern; if (functionBodyParser.Parse(source, index).If(out var block, out var i)) { index = i; var condition = functionBodyParser.Condition; var where = functionBodyParser.Where; Verb verb; if (isInit) { verb = createInitializer(index, block); result.Value = lambda; singleLine = !functionBodyParser.MultiCapable; return(verb); } if (isCoFunc) { overridePosition = index; var builder = new CofunctionBuilder(functionName, parameters, block); return(builder.Generate()); } verb = createFunction(index, currying, condition, memoize, lockedDown, block); lambda.XMethod = xMethod; lambda.Expand = type == "rec"; result.Value = lambda; singleLine = !functionBodyParser.MultiCapable; if (lambda.Where == null) { lambda.Where = where; } return(verb); } return(null); }
public override Verb CreateVerb(string[] tokens) { var whitespaces = tokens[1]; statementIndex = position + whitespaces.Length; var tokens2Length = tokens[2].Length; var visibilityName = tokens[2].Trim(); visibility = ParseVisibility(visibilityName); var tokens3Length = tokens[3].Length; _override = tokens3Length > 0; var tokens4Length = tokens[4].Length; var memoize = tokens4Length > 0; var tokens5Length = tokens[5].Length; var type = tokens[5].Trim(); var tokens6Length = tokens[6].Length; functionName = LongToMangledPrefix(type, tokens[6].Trim()); var parameterType = tokens[7]; var parametersType = ParametersType.Message; switch (parameterType) { case "(": parametersType = ParametersType.Standard; break; case "[": parametersType = ParametersType.Pattern; break; } var xMethod = false; var isDef = true; lockedDown = false; var isInit = false; var isCoFunc = false; switch (type) { case "cofunc": isCoFunc = true; break; case "xfunc": xMethod = true; break; case "pure": lockedDown = true; break; case "init": isDef = false; isInit = true; break; } Reject(LockedDown && type == "set", VerboseName, "Setters not allowed in views"); Reject(!InClassDefinition && visibilityName.IsNotEmpty(), VerboseName, $"Visibility specifier {visibility} not allowed allowed outside of class definition"); Reject(!InClassDefinition && !isDef, VerboseName, $"{type} specifier not allowed outside of a class definition"); Reject(InClassDefinition && xMethod, VerboseName, "xfunc not allowed inside class definitions"); Color(position, whitespaces.Length, Whitespaces); Color(tokens2Length, KeyWords); Color(tokens3Length, KeyWords); Color(tokens4Length, KeyWords); Color(tokens5Length, KeyWords); var invokable = parametersType == ParametersType.Standard || parametersType == ParametersType.Pattern; var entityType = invokable ? Invokeables : Messaging; Color(tokens6Length, entityType); Color(parameterType.Length, Structures); var index = NextPosition; var parametersParser = new ParametersParser(parametersType); if (parametersParser.Parse(source, index).If(out var parsed)) { int newIndex; (parameters, newIndex) = parsed; index = newIndex; if (source.Skip(index).Take(1) == "(") { var curriedFunctionParser = new CurriedFunctionParser(functionName, parameters, visibility, _override); if (curriedFunctionParser.Scan(source, index)) { overridePosition = curriedFunctionParser.Position; return(curriedFunctionParser.Verb); } } } else { var builder = new StringBuilder(); var messageParameterParser = new MessageParameterParser(); var variableParser = new VariableParser(); var parameterList = new List <Parameter>(); if (variableParser.Scan(source, index)) { var variable = (Variable)variableParser.Value; var parameter = new Parameter(variable.Name); builder.Append(functionName); builder.Append("_"); parameterList.Add(parameter); index = variableParser.Position; } else { return(null); } while (messageParameterParser.Scan(source, index)) { var parameter = new Parameter(messageParameterParser.ParameterName); parameterList.Add(parameter); builder.Append(messageParameterParser.MessageName); builder.Append("_"); index = messageParameterParser.Result.Position; } functionName = builder.ToString(); parameters = new Parameters(parameterList); } RejectNull(parameters, VerboseName, "Parameters malformed"); var currying = parametersParser.Currying; functionBodyParser.ExtractCondition = parametersType == ParametersType.Pattern; if (functionBodyParser.Parse(source, index).If(out var block, out var i)) { index = i; var condition = functionBodyParser.Condition; var where = functionBodyParser.Where; Verb verb; if (isInit) { verb = createInitializer(index, block); result.Value = lambda; singleLine = !functionBodyParser.MultiCapable; return(verb); } if (isCoFunc) { overridePosition = index; var builder = new CofunctionBuilder(functionName, parameters, block); return(builder.Generate()); } verb = createFunction(index, currying, condition, memoize, lockedDown, block); lambda.XMethod = xMethod; lambda.Expand = type == "rec"; result.Value = lambda; singleLine = !functionBodyParser.MultiCapable; if (lambda.Where == null) { lambda.Where = where; } return(verb); } return(null); /* return functionBodyParser.Parse(source, index).Map((block, i) => * { * index = i; * var condition = functionBodyParser.Condition; * var where = functionBodyParser.Where; * Verb verb; * if (isInit) * { * verb = createInitializer(index, block); * result.Value = lambda; * singleLine = !functionBodyParser.MultiCapable; * return verb; * } * * if (isCoFunc) * { * overridePosition = index; * var builder = new CofunctionBuilder(functionName, parameters, block); * return builder.Generate(); * } * * verb = createFunction(index, currying, condition, memoize, lockedDown, block); * lambda.XMethod = xMethod; * lambda.Expand = type == "rec"; * result.Value = lambda; * singleLine = !functionBodyParser.MultiCapable; * if (lambda.Where == null) * lambda.Where = where; * return verb; * }, () => null);*/ }