private IExpression Parse(TokenOrExpression tokenOrExpression) { if (tokenOrExpression.Expression != null) { return(tokenOrExpression.Expression); } return(Parse(tokenOrExpression.Token)); }
private bool TryParseVariableReference(List <TokenOrExpression> tokens) { if (Matches(tokens, TokenType.Dollar, TokenType.Literal)) { TokenOrExpression name = tokens[1]; tokens.RemoveRange(0, 2); tokens.Insert(0, new TokenOrExpression(CreateVariableExpression(name.Token.Value))); return(true); } return(false); }
private IExpression Parse(IEnumerable <Token> tokens) { var stack = new List <TokenOrExpression>(); int highestPrecedence = 0; using (IEnumerator <Token> iterator = tokens.GetEnumerator()) { while (iterator.MoveNext()) { Token token = iterator.Current; if (token.Type == TokenType.Whitespace) { continue; } if (IsOperator(token.Type)) { int precedence = Precedence(token.Type); if (precedence < highestPrecedence) { TryParseLeftToRight(stack); } stack.Add(token); highestPrecedence = precedence; } else if (token.Type == TokenType.Quotation) { var stringTokens = FindTokensInString(iterator); stack.Add(new TokenOrExpression(StringLiteral.Create(stringTokens))); } else { stack.Add(token); } } } if (stack.Count == 0) { return(null); } if (!TryParseLeftToRight(stack)) { throw new ParseException(); } TokenOrExpression tok = stack[0]; return(tok.Expression); }
private bool TryParseLiteral(List <TokenOrExpression> tokens) { if (Matches(tokens, TokenType.True)) { tokens[0] = new TokenOrExpression(new BoolLiteral(true)); return(true); } if (Matches(tokens, TokenType.False)) { tokens[0] = new TokenOrExpression(new BoolLiteral(false)); return(true); } if (Matches(tokens, TokenType.Literal)) { tokens[0] = new TokenOrExpression(Literal.Create(tokens[0].Token.Value)); return(true); } return(false); }
private bool TryParseOne(List <TokenOrExpression> tokens) { if (TryParseVariableReference(tokens)) { return(true); } if (TryParseBinaryOperation(tokens)) { return(true); } if (TryParseUnaryOperation(tokens)) { return(true); } if (TryParseLiteral(tokens)) { return(true); } if (tokens.Count >= 1) { if (tokens[0].Expression != null) { return(true); } if (tokens[0].Token.Type == TokenType.Literal) { tokens[0] = new TokenOrExpression(new StringLiteral(tokens[0].Token.Value)); return(true); } } return(false); }
private bool TryParseBinaryOperation(List <TokenOrExpression> tokens) { if (tokens.Count >= 3 && IsBinaryOperator(tokens[1].Token.Type, out var operation)) { // Binary expression TokenOrExpression lhs = tokens[0]; tokens.RemoveRange(0, 2); TryParseLeftToRight(tokens); if (tokens.Count != 1) { throw new ParseException(); } IExpression leftHandSide = Parse(lhs); IExpression rightHandSide = tokens[0].Expression; var expression = BinaryExpression.Create(operation, leftHandSide, rightHandSide); tokens.RemoveAt(0); tokens.Insert(0, new TokenOrExpression(expression)); return(true); } return(false); }