public static IEnumerable <Field> ParseFunctionParameters(Compiler compiler, TokenData <MetaToken> target, string parameters) { if (parameters.Trim().Length == 0) { return new[] { new Field(target.Start, target.Length, compiler, Compiler.Void, string.Empty) } } ; return(parameters.Split(',').Select(param => { var parts = Regex.Split(param.Trim(), @"\s+"); if (parts.Length == 2) { return new Field(target.GetSourceIndex(), target.GetSourceLength(), compiler, parts[0], parts[1]); } else { throw new SourceError(target.GetSourceIndex(), target.GetSourceLength(), SourceError.InvalidParameterSyntax); } })); }
public static Expression ParseExpression(TokenData <MetaToken> target, ArraySegment <TokenData <MetaToken> > tokens) { if (tokens.Count == 0) { return(new VoidExpression(target.Start, target.Length)); } else if (tokens.Count == 1) { var token = tokens[0]; switch (token.Type) { case MetaToken.SubExpression: return(ParseExpression(token, token.LogicalChildren)); case MetaToken.IdentifierExpression: { if (token.Attributes.TryGetValue(Tokens.Name, out string name)) { return(new IdentifierExpression(token.GetSourceIndex(), token.GetSourceLength(), name)); } else { throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.MissingAttribute); } } case MetaToken.LiteralExpression: { if (token.Attributes.TryGetValue(Tokens.Value, out string value)) { return(new LiteralExpression(token.GetSourceIndex(), token.GetSourceLength(), Compiler.NativeInt, value)); } else { throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.MissingAttribute); } } case MetaToken.Call: { if (token.Attributes.TryGetValue(Tokens.Name, out string name)) { return(new CallExpression(token.GetSourceIndex(), token.GetSourceLength(), name, token.LogicalChildren.Value.Select(child => ParseExpression(child, child.LogicalChildren)))); } else { throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.MissingAttribute); } } default: throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.WrongContext); } } else { var postfix = new List <TokenData <MetaToken> >(); var stack = new Stack <TokenData <MetaToken> >(); for (int i = 0; i < tokens.Count; i++) { var token = tokens[i]; switch (token.Type) { case MetaToken.SubExpression: postfix.Add(token); break; case MetaToken.Operator: stack.Push(token); break; case MetaToken.IdentifierExpression: postfix.Add(token); break; case MetaToken.LiteralExpression: postfix.Add(token); break; case MetaToken.Whitespace: break; default: throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.WrongContext); } } while (stack.Count > 0) { postfix.Add(stack.Pop()); } if (postfix.Count == 3) { var left = ParseExpression(postfix[0], new ArraySegment <TokenData <MetaToken> >(new[] { postfix[0] })); var right = ParseExpression(postfix[1], new ArraySegment <TokenData <MetaToken> >(new[] { postfix[1] })); var token = postfix[2]; if (token.Type == MetaToken.Operator) { if (token.Attributes.TryGetValue(Tokens.Name, out string name)) { var op = new FunctionReference(target.GetSourceIndex(), target.GetSourceLength(), name, new[] { left.ReturnType, right.ReturnType }); return(new BinaryExpression(target.GetSourceIndex(), target.GetSourceLength(), left, op, right)); } else { throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.MissingAttribute); } } else { throw new SourceError(token.GetSourceIndex(), token.GetSourceLength(), SourceError.InvalidExpression); } } throw new SourceError(target.GetSourceIndex(), target.GetSourceLength(), SourceError.InvalidExpression); } }