public override IMatched <Unit> Parse(ParseState state, Token[] tokens, ExpressionBuilder builder) { state.Colorize(tokens, Color.Whitespace, Color.Keyword, Color.Whitespace); state.CreateYieldFlag(); if (getBlock(state).ValueOrCast <Unit>(out var block, out var asUnit)) { var yielding = state.RemoveYieldFlag(); if (yielding) { builder.Add(new SeqSymbol(block)); return(Unit.Matched()); } else { return("Yield required".FailedMatch <Unit>()); } } else { return(asUnit); } }
public override IMatched <Unit> ParseStatement(ParseState state, Token[] tokens) { var overriding = tokens[1].Text.StartsWith("override"); var isOperator = tokens[2].Text == "op"; var isMacro = tokens[2].Text == "def"; var className = tokens[4].Text; if (className.IsEmpty() && TraitName.IsNotEmpty()) { className = TraitName; } var functionName = tokens[6].Text; var type = tokens[7].Text; if (isOperator && !Module.Global.RegisterOperator(functionName)) { return($"Operator {functionName} already registered".FailedMatch <Unit>()); } var needsParameters = type == "("; if (needsParameters) { state.Colorize(tokens, Color.Keyword, Color.Keyword, Color.Whitespace, Color.Class, Color.Structure, Color.Invokable, Color.OpenParenthesis); if (functionName.IsMatch("^ /w+ '=' $")) { functionName = $"__${functionName.Drop(-1)}="; } } else { state.Colorize(tokens, Color.Keyword, Color.Keyword, Color.Whitespace, Color.Class, Color.Structure, Color.Invokable); functionName = $"__${functionName}"; } state.CreateYieldFlag(); state.CreateReturnType(); if (GetAnyParameters(needsParameters, state).ValueOrCast <Unit>(out var parameters, out var asUnit)) { if (state.CurrentSource.IsMatch("^ /s* '|'")) { return(getMatchFunction(state, functionName, parameters, overriding, className)); } else if (state.CurrentSource.StartsWith("(")) { return(getCurriedFunction(state, functionName, parameters, overriding, className).Map(f => { if (isMacro) { state.RegisterMacro(f); } else { state.AddStatement(f); } return Unit.Matched(); })); } else { return(getAnyBlock(state).Map(block => { var yielding = state.RemoveYieldFlag(); state.RemoveReturnType(); var function = new Function(functionName, parameters, block, yielding, overriding, className); if (isMacro) { state.RegisterMacro(function); } else { state.AddStatement(function); } return Unit.Matched(); })); } } else { return(asUnit); } }