public IList<BaseExpression> ParseArguments(TokensQueue tokens) { var res = new List<BaseExpression>(); while (!tokens.IsEndOfLine) { var preview = tokens.Peek(); if (preview.Type == TokenType.CloseParenthesis) return res; var arg = Parse(tokens); res.Add(arg); preview = tokens.Peek(); if (preview.Type != TokenType.Comma) break; tokens.Read(TokenType.Comma); } return res; }
protected BaseExpression ParseLiteral(Token token, TokensQueue queue) { if (queue.Count > 0) { var preview = queue.Peek(); if (preview.Type == TokenType.OpenParenthesis) { return Func(token, queue); } } if (token.StringValue == "$") { return new NumberExpression { Value = _context.Offset }; } var lblValue = _context.GetLabel(token); if (lblValue == null) { throw new TokenException("unknown symbol " + token.StringValue, token); } return new NumberExpression { Value = (long)lblValue }; }
private BaseExpression ParseWithPriority(TokensQueue tokens, int priority) { BaseExpression left = ParseOperand(tokens); while (tokens.Count > 0) { var preview = tokens.Peek(); switch (preview.Type) { case TokenType.NewLine: case TokenType.Comma: case TokenType.CloseParenthesis: return left; } var tokenPriority = GetPriority(preview.Type); if (tokenPriority >= 0 && tokenPriority < priority) { if (left != null) return left; throw new Exception("some case"); } var token = tokens.Read(); switch (token.Type) { case TokenType.Plus: case TokenType.Minus: case TokenType.Multiply: case TokenType.Divide: case TokenType.Mod: case TokenType.LeftShift: case TokenType.RightShift: case TokenType.BitOr: case TokenType.BitAnd: case TokenType.BitXor: left = ProcessBinaryExpression(token, left, tokens); break; default: throw new TokenException("unexpected token " + token.StringValue, token); } } return left; }