public static IMaybe <(Block, int)> GetBlock(string source, int index, bool advanceTabs, InclusionType inclusion = InclusionType.Classes, bool compileAll = false) { if (advanceTabs) { AdvanceTabs(); } var whenUnlessParser = new WhenUnlessParser(); var statementParser = new StatementParser { Inclusions = inclusion }; var block = new Block(); var continuing = true; while (continuing && index < source.Length) { continuing = false; foreach (var parserResult in statementParser.Parsers .Where(parser => parser.Scan(source, index)) .Select(parser => parser.Result)) { whenUnlessParser.OtherVerb = parserResult.Verb; if (whenUnlessParser.Scan(source, parserResult.Position)) { block.Add(whenUnlessParser.Verb); index = whenUnlessParser.Position; } else { block.Add(parserResult.Verb); index = parserResult.Position; } continuing = true; break; } if (continuing && index < source.Length) { var endParser = new EndParser(); if (endParser.Scan(source, index)) { index = endParser.Position; } } } if (compileAll) { index.Must().BeGreaterThanOrEqual(source.Length).OrThrow("Compilation", () => $"Didn't understand {source.Drop(index)}"); } if (advanceTabs) { RegressTabs(); } return(maybe(block.Count > 0, () => (block, index))); }
public override Verb CreateVerb(string[] tokens) { Color(position, tokens[1].Length, KeyWords); var index = NextPosition; if (GetExpressionThenBlock(source, index).If(out var conditionExpression, out var resultBlock, out var newIndex)) { index = newIndex; var _if = new If(conditionExpression, resultBlock); var sourceLength = source.Length; var currentIf = _if; while (index < sourceLength && parser.Scan(source, index, "^ /(|tabs| 'elseif') /b")) { parser.ColorAll(KeyWords); index = parser.Position; if (GetExpressionThenBlock(source, index).If(out conditionExpression, out resultBlock, out newIndex)) { index = newIndex; var elseIf = new If(conditionExpression, resultBlock); currentIf.Next = elseIf; currentIf = elseIf; } } if (parser.Scan(source, index, "^ /(|tabs| 'else') (/r /n | /r | /n) ")) { parser.ColorAll(KeyWords); index = parser.Position; if (GetBlock(source, index, true).If(out resultBlock, out newIndex)) { _if.ElseBlock = resultBlock; index = newIndex; } else { _if.ElseBlock = null; } } var endParser = new EndParser(); if (endParser.Scan(source, index)) { index = endParser.Position; } overridePosition = index; return(new IfExecute(_if) { Index = position }); } return(null); }
public override Verb CreateVerb(string[] tokens) { var optionalLength = tokens[2].Length; var optional = tokens[2].Trim() == "optional"; if (!InClassDefinition && optional) { return(null); } Color(position, tokens[1].Length, Whitespaces); Color(optionalLength, KeyWords); var type = tokens[3].Trim(); Color(tokens[3].Length, KeyWords); var name = tokens[4]; var isStandard = tokens[5] == "("; Color(name.Length, isStandard ? Invokeables : Messaging); name = LongToMangledPrefix(type, name); Color(tokens[5].Length, Structures); var index = position + length; if (isStandard) { var parameterListParser = new ParameterListParser2(); if (parameterListParser.Parse(source, index).If(out var list, out var newIndex)) { var parameterCount = list.Count; var endParser = new EndParser(); index = newIndex; if (endParser.Scan(source, index)) { index = endParser.Position; } overridePosition = index; result.Value = new Signature(name, parameterCount, optional); return(new NullOp()); } return(null); } 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.Result.Value; var parameter = new Parameter(variable.Name); builder.Append(name); builder.Append("_"); parameterList.Add(parameter); index = variableParser.Result.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; } if (freeParser.Scan(source, index, REGEX_END1)) { freeParser.ColorAll(Structures); overridePosition = freeParser.Position; name = builder.ToString(); result.Value = new Signature(name, parameterList.Count, optional); return(new NullOp()); } return(null); }
public override Verb CreateVerb(string[] tokens) { var isAbstract = tokens[2].IsNotEmpty(); var type = tokens[3].Trim(); var className = tokens[4]; var parameterBegin = tokens[5]; ClassName = className; EnumerationValue = -1; CurrentVisibility = Object.VisibilityType.Public; Color(position, tokens[1].Length, Whitespaces); Color(tokens[2].Length, KeyWords); Color(tokens[3].Length, KeyWords); Color(className.Length, Types); Color(parameterBegin.Length, Structures); Parameters parameters; int index; if (parameterBegin == "(" && type != "module") { Color(parameterBegin.Length, Structures); index = position + length; var parametersParser = new ParametersParser(); var parsed = parametersParser.Parse(source, index); if (!parsed.If(out parameters, out index)) { return(null); } if (type == "enum") { parameters.Unshift(new Parameter("name")); parameters.Unshift(new Parameter("value")); } } else if (type == "enum") { parameters = new Parameters(new[] { new Parameter("value"), new Parameter("name") }); index = position + length; } else { parameters = new Parameters(); index = position + length; } (var superClass, var superParameters, var traits, var newIndex) = Ancestors(source, index); index = newIndex; var endParser = new EndParser(); if (endParser.Scan(source, index)) { index = endParser.Position; } Block objectBlock; InClassDefinition = true; EnumerationMappingCode = new CodeBuilder(); try { if (type == "enum") { addEnumerationSupport(className); } LockedDown = type == "view"; if (GetBlock(source, index, true, InClass).If(out var block, out newIndex)) { objectBlock = block; index = newIndex; if (type == "enum") { addEnumerationInstanceSupport(ref objectBlock); } } else { objectBlock = new Block(); } } finally { InClassDefinition = false; if (EnumerationMappingCode != null) { AddStaticBlock(EnumerationMappingCode.Block); } EnumerationMappingCode = null; LockedDown = false; } var checker = new InheritanceChecker(className, objectBlock, parameters, superClass, isAbstract, traits); var passes = checker.Passes(); Assert(passes.IsSuccessful, LOCATION, () => passes.Exception.Message); var cls = new Class(parameters, objectBlock, GetStaticBlock(), superClass, traits, superParameters, type == "view"); CompilerState.RegisterClass(ClassName, cls); result.Value = cls; overridePosition = index; ClassName = ""; switch (type) { case "module": return(new CreateModule(className, cls, true) { Index = position }); case "extend": return(new CreateExtender(className, cls)); default: var verb = new CreateClass(className, cls) { HelperFunctions = HelperFunctions, HelperBlock = HelperBlock, Index = position }; HelperFunctions = null; HelperBlock = null; return(verb); } }