Esempio n. 1
0
 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;
 }
Esempio n. 2
0
 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 };
 }
Esempio n. 3
0
        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;
        }