Esempio n. 1
0
        public ExprOp Parse(InputTextStream inStream, AmountParseFlagsEnum flags = AmountParseFlagsEnum.PARSE_DEFAULT, string originalString = null)
        {
            try
            {
                ExprOp topNode = ParseValueExpr(inStream, flags);

                if (UseLookahead)
                {
                    UseLookahead = false;
                    Lookahead.Rewind(inStream);
                }
                Lookahead.Clear();

                return(topNode);
            }
            catch
            {
                if (!String.IsNullOrEmpty(originalString))
                {
                    ErrorContext.Current.AddErrorContext("While parsing value expression:");
                    int endPos = inStream.Pos;
                    int pos    = endPos > 0 ? endPos - Lookahead.Length : 0;
                    ErrorContext.Current.AddErrorContext(ErrorContext.LineContext(originalString, pos, endPos));
                }
                throw;
            }
        }
Esempio n. 2
0
        public ExprOp ParseOrExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp node = ParseAndExpr(inStream, tFlags);

            if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE))
            {
                while (true)
                {
                    ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT);
                    if (tok.Kind == ExprTokenKind.KW_OR)
                    {
                        ExprOp prev = node;
                        node       = new ExprOp(OpKindEnum.O_OR);
                        node.Left  = prev;
                        node.Right = ParseAndExpr(inStream, tFlags);
                        if (node.Right == null)
                        {
                            throw new ParseError(String.Format(ParseError.ParseError_OperatorNotFollowedByArgument, tok.Symbol));
                        }
                    }
                    else
                    {
                        PushToken(tok);
                        break;
                    }
                }
            }

            return(node);
        }
Esempio n. 3
0
        public ExprOp ParseAssingExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp node = ParseLambdaExpr(inStream, tFlags);

            if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE))
            {
                while (true)
                {
                    ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT);
                    if (tok.Kind == ExprTokenKind.ASSIGN)
                    {
                        ExprOp prev = node;
                        node      = new ExprOp(OpKindEnum.O_DEFINE);
                        node.Left = prev;
                        ExprOp scope = new ExprOp(OpKindEnum.SCOPE);
                        scope.Left = ParseLambdaExpr(inStream, tFlags);
                        node.Right = scope;
                    }
                    else
                    {
                        PushToken(tok);
                        break;
                    }
                }
            }

            return(node);
        }
Esempio n. 4
0
        public ExprOp ParseValueTerm(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp    node = null;
            ExprToken tok  = NextToken(inStream, tFlags);

            switch (tok.Kind)
            {
            case ExprTokenKind.VALUE:
                node         = new ExprOp(OpKindEnum.VALUE);
                node.AsValue = tok.Value;
                break;

            case ExprTokenKind.IDENT:
                string ident = tok.Value.AsString;

                node         = new ExprOp(OpKindEnum.IDENT);
                node.AsIdent = ident;
                break;

            case ExprTokenKind.LPAREN:
                node = ParseValueExpr(inStream, (tFlags | AmountParseFlagsEnum.PARSE_PARTIAL) & ~AmountParseFlagsEnum.PARSE_SINGLE);
                tok  = NextToken(inStream, tFlags, ExprTokenKind.RPAREN);
                break;

            default:
                PushToken(tok);
                break;
            }

            return(node);
        }
Esempio n. 5
0
        /// <summary>
        /// Ported from parse_single_expression
        /// </summary>
        private Expr ParseSingleExpression(InputTextStream inStream, bool singleExpr = true)
        {
            string p      = inStream.RemainSource;
            int    pIndex = inStream.Pos;

            Expr expr = new Expr();

            expr.Parse(inStream, singleExpr ? AmountParseFlagsEnum.PARSE_SINGLE : AmountParseFlagsEnum.PARSE_PARTIAL, p);

            if (inStream.Eof)
            {
                expr.Text = p;
            }
            else
            {
                expr.Text = p.Substring(0, inStream.Pos - pIndex);

                inStream.Pos--;
                // Don't gobble up any whitespace
                while (char.IsWhiteSpace(inStream.Peek))
                {
                    inStream.Pos--;
                }
            }
            return(expr);
        }
Esempio n. 6
0
        public ExprOp ParseCallExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp node = ParseValueTerm(inStream, tFlags);

            if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE))
            {
                while (true)
                {
                    ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT);
                    if (tok.Kind == ExprTokenKind.LPAREN)
                    {
                        ExprOp prev = node;
                        node      = new ExprOp(OpKindEnum.O_CALL);
                        node.Left = prev;
                        PushToken(tok);  // let the parser see the '(' again
                        node.Right = ParseValueExpr(inStream, tFlags | AmountParseFlagsEnum.PARSE_SINGLE);
                    }
                    else
                    {
                        PushToken(tok);
                        break;
                    }
                }
            }

            return(node);
        }
Esempio n. 7
0
        public ExprOp Parse(InputTextStream inStream, AmountParseFlagsEnum flags = AmountParseFlagsEnum.PARSE_DEFAULT, string originalString = null)
        {
            try
            {
                ExprOp topNode = ParseValueExpr(inStream, flags);

                if (UseLookahead)
                {
                    UseLookahead = false;
                    Lookahead.Rewind(inStream);
                }
                Lookahead.Clear();

                return(topNode);
            }
            catch
            {
                if (!String.IsNullOrEmpty(originalString))
                {
                    ErrorContext.Current.AddErrorContext("While parsing value expression:");
                    int endPos = inStream.Pos;
                    int pos    = endPos > 0 ? endPos - Lookahead.Length : 0;

                    Logger.Current.Debug("parser.error", () => String.Format("original_string = '{0}'", originalString));
                    Logger.Current.Debug("parser.error", () => String.Format("            pos = {0}", pos));
                    Logger.Current.Debug("parser.error", () => String.Format("        end_pos = {0}", endPos));
                    Logger.Current.Debug("parser.error", () => String.Format("     token kind = {0}", Lookahead.Kind));
                    Logger.Current.Debug("parser.error", () => String.Format("   token length = {0}", Lookahead.Length));

                    ErrorContext.Current.AddErrorContext(ErrorContext.LineContext(originalString, pos, endPos));
                }
                throw;
            }
        }
Esempio n. 8
0
        public ExprOp ParseUnaryExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp    node = null;
            ExprToken tok  = NextToken(inStream, tFlags);

            switch (tok.Kind)
            {
            case ExprTokenKind.EXCLAM:
            {
                ExprOp term = ParseDotExpr(inStream, tFlags);
                if (term == null)
                {
                    throw new ParseError(String.Format(ParseError.ParseError_OperatorNotFollowedByArgument, tok.Symbol));
                }

                // A very quick optimization
                if (term.Kind == OpKindEnum.VALUE)
                {
                    term.AsValue.InPlaceNot();
                    node = term;
                }
                else
                {
                    node      = new ExprOp(OpKindEnum.O_NOT);
                    node.Left = term;
                }
                break;
            }

            case ExprTokenKind.MINUS:
            {
                ExprOp term = ParseDotExpr(inStream, tFlags);
                if (term == null)
                {
                    throw new ParseError(String.Format(ParseError.ParseError_OperatorNotFollowedByArgument, tok.Symbol));
                }

                // A very quick optimization
                if (term.Kind == OpKindEnum.VALUE)
                {
                    term.AsValue.InPlaceNegate();
                    node = term;
                }
                else
                {
                    node      = new ExprOp(OpKindEnum.O_NEG);
                    node.Left = term;
                }
                break;
            }

            default:
                PushToken(tok);
                node = ParseDotExpr(inStream, tFlags);
                break;
            }

            return(node);
        }
Esempio n. 9
0
        public void ExprParser_ParseUnaryExpr_MINUS_Produces_O_NEG()
        {
            var parser   = new ExprParser();
            var inStream = new InputTextStream("-SOMETHING");
            var exprOp   = parser.ParseUnaryExpr(inStream, AmountParseFlagsEnum.PARSE_DEFAULT);

            Assert.AreEqual(OpKindEnum.O_NEG, exprOp.Kind);
        }
Esempio n. 10
0
        static internal ErrorCode InternalUpdateState32(State32 state, byte[] input, int offset, int length)
        {
            InputTextStream p    = new InputTextStream(input, offset);
            long            bEnd = p.Position + length;

            state.total_len += (ulong)length;

            if (state.memsize + length < 16)               /* fill in tmp buffer */
            {
                Array.Copy(input, offset, state.mem32, state.memsize, length);
                state.memsize += (uint)length;
                return(ErrorCode.XXH_OK);
            }

            if (state.memsize > 0)               /* some data left from previous update */
            {
                Array.Copy(input, offset, state.mem32, state.memsize, 16 - state.memsize);
                {
                    InputTextStream p32 = new InputTextStream(state.mem32);
                    state.v1 = XXH32_round(state.v1, p32.ReadUInt32());
                    state.v2 = XXH32_round(state.v2, p32.ReadUInt32());
                    state.v3 = XXH32_round(state.v3, p32.ReadUInt32());
                    state.v4 = XXH32_round(state.v4, p32.ReadUInt32());
                }
                p.Skip(16 - (int)state.memsize);
                state.memsize = 0;
            }

            if (p.Position <= bEnd - 16)
            {
                long limit = bEnd - 16;
                uint v1    = state.v1;
                uint v2    = state.v2;
                uint v3    = state.v3;
                uint v4    = state.v4;

                do
                {
                    v1 = XXH32_round(v1, p.ReadUInt32());
                    v2 = XXH32_round(v2, p.ReadUInt32());
                    v3 = XXH32_round(v3, p.ReadUInt32());
                    v4 = XXH32_round(v4, p.ReadUInt32());
                }while (p.Position <= limit);

                state.v1 = v1;
                state.v2 = v2;
                state.v3 = v3;
                state.v4 = v4;
            }

            if (p.Position < bEnd)
            {
                Array.Copy(input, p.Position, state.mem32, 0, bEnd - p.Position);
                state.memsize = (uint)(bEnd - p.Position);
            }

            return(ErrorCode.XXH_OK);
        }
Esempio n. 11
0
        public void InputTextStream_ReadInt_ReturnsDefaultValueIfNoDigits()
        {
            InputTextStream stream = new InputTextStream("()");
            char            nextChar;
            int             result = stream.ReadInt(25, out nextChar);

            Assert.Equal(25, result);
            Assert.Equal('(', nextChar);
        }
Esempio n. 12
0
        public void InputTextStream_ReadInt_ReadsIntegerValue()
        {
            InputTextStream stream = new InputTextStream("12345)");
            char            nextChar;
            int             result = stream.ReadInt(0, out nextChar);

            Assert.Equal(12345, result);
            Assert.Equal(')', nextChar);
        }
Esempio n. 13
0
        public void ParseIdent(InputTextStream inStream)
        {
            Kind = ExprTokenKind.IDENT;

            string buf;
            char   c;

            Length = inStream.ReadInto(out buf, out c, ch => char.IsLetterOrDigit(ch) || ch == '_');

            Value = Value.Get(buf, true); // [DM] It equals to 'value.set_string(buf);'
        }
Esempio n. 14
0
        public void ExprTokenTests_ParseIdent_DetectsIdentifiers()
        {
            String          source   = "ident ident1 ident_2";
            InputTextStream inStream = new InputTextStream(source);

            ExprToken  token = new ExprToken();
            Func <int> act   = () => { token.ParseIdent(inStream); return(0); };

            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.IDENT, 5, Value.Get("ident"), String.Empty);
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.IDENT, 6, Value.Get("ident1"), String.Empty);
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.IDENT, 7, Value.Get("ident_2"), String.Empty);
        }
Esempio n. 15
0
        static internal ulong InternalDigestState64(State64 state)
        {
            InputTextStream p    = new InputTextStream(state.mem64);
            long            bEnd = state.memsize;
            ulong           h64;

            if (state.total_len >= 32)
            {
                ulong v1 = state.v1;
                ulong v2 = state.v2;
                ulong v3 = state.v3;
                ulong v4 = state.v4;

                h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);
                h64 = XXH64_mergeRound(h64, v1);
                h64 = XXH64_mergeRound(h64, v2);
                h64 = XXH64_mergeRound(h64, v3);
                h64 = XXH64_mergeRound(h64, v4);
            }
            else
            {
                h64 = state.v3 + PRIME64_5;
            }

            h64 += state.total_len;

            while (p.Position + 8 <= bEnd)
            {
                ulong k1 = XXH64_round(0, p.ReadUInt64());
                h64 ^= k1;
                h64  = XXH_rotl64(h64, 27) * PRIME64_1 + PRIME64_4;
            }

            if (p.Position + 4 <= bEnd)
            {
                h64 ^= (ulong)(p.ReadUInt32()) * PRIME64_1;
                h64  = XXH_rotl64(h64, 23) * PRIME64_2 + PRIME64_3;
            }

            while (p.Position < bEnd)
            {
                h64 ^= p.ReadByte() * PRIME64_5;
                h64  = XXH_rotl64(h64, 11) * PRIME64_1;
            }

            h64 ^= h64 >> 33;
            h64 *= PRIME64_2;
            h64 ^= h64 >> 29;
            h64 *= PRIME64_3;
            h64 ^= h64 >> 32;

            return(h64);
        }
Esempio n. 16
0
        private void ReadAndCheckTokenProps(Func <int> act, ref ExprToken token, InputTextStream inStream, int expectedResult, ExprTokenKind expectedKind, int expectedLength, Value expectedValue, string expectedSymbol)
        {
            inStream.PeekNextNonWS();
            token.Clear();
            int result = act();

            Assert.Equal(expectedResult, result);
            Assert.Equal(expectedKind, token.Kind);
            Assert.Equal(expectedLength, token.Length);
            Assert.True(expectedValue.IsEqualTo(token.Value));
            Assert.Equal(expectedSymbol, token.Symbol);
        }
Esempio n. 17
0
        public void ExprParser_Parse_HandlesDivExpression()
        {
            string          expr     = "4/3";
            InputTextStream inStream = new InputTextStream(expr);

            ExprParser parser = new ExprParser();
            ExprOp     result = parser.Parse(inStream);

            Assert.IsNotNull(result);
            Assert.AreEqual(OpKindEnum.O_DIV, result.Kind);
            Assert.AreEqual(4, result.Left.AsValue.AsLong);
            Assert.AreEqual(3, result.Right.AsValue.AsLong);
        }
Esempio n. 18
0
        public void ExprParser_Parse_HandlesMultExpression()
        {
            string          expr     = "2*3";
            InputTextStream inStream = new InputTextStream(expr);

            ExprParser parser = new ExprParser();
            ExprOp     result = parser.Parse(inStream);

            Assert.NotNull(result);
            Assert.Equal(OpKindEnum.O_MUL, result.Kind);
            Assert.Equal(2, result.Left.AsValue.AsLong);
            Assert.Equal(3, result.Right.AsValue.AsLong);
        }
Esempio n. 19
0
        public void ExprParser_Parse_HandlesSubtractExpression()
        {
            string          expr     = "4 - 3"; // #fix-expr-parser - note that '4-3' does not work (parse_quantity issue)
            InputTextStream inStream = new InputTextStream(expr);

            ExprParser parser = new ExprParser();
            ExprOp     result = parser.Parse(inStream);

            Assert.IsNotNull(result);
            Assert.AreEqual(OpKindEnum.O_SUB, result.Kind);
            Assert.AreEqual(4, result.Left.AsValue.AsLong);
            Assert.AreEqual(3, result.Right.AsValue.AsLong);
        }
Esempio n. 20
0
        public ExprToken NextToken(InputTextStream inStream, AmountParseFlagsEnum tFlags, ExprTokenKind?expecting = null)
        {
            if (UseLookahead)
            {
                UseLookahead = false;
            }
            else
            {
                Lookahead.Next(inStream, tFlags);
            }

            if (expecting.HasValue && Lookahead.Kind != expecting.Value)
            {
                Lookahead.Expected(expecting.Value);
            }

            return(Lookahead);
        }
Esempio n. 21
0
        public void ExprTokenTests_Next_DetectsTokensInLine()
        {
            String          source   = "& && | || ( ) [2015/10/15] 'ASD' \"qwe\" {22} ! != !~ - -> + * ? : /\\\\s/ = =~ == < <= > >= . , ; and my_ident , 23";
            InputTextStream inStream = new InputTextStream(source);

            ExprToken  token = new ExprToken();
            Func <int> act   = () => { token.Next(inStream, AmountParseFlagsEnum.PARSE_NO_MIGRATE); return(0); };

            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.KW_AND, 1, Value.Empty, "&");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.KW_AND, 2, Value.Empty, "&");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.KW_OR, 1, Value.Empty, "|");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.KW_OR, 2, Value.Empty, "|");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.LPAREN, 1, Value.Empty, "(");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.RPAREN, 1, Value.Empty, ")");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 12, Value.Get(new Date(2015, 10, 15)), "[");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 5, Value.Get("ASD"), "'");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 5, Value.Get("qwe"), "\"");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 2, Value.Get(new Amount(22)), "{");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.EXCLAM, 1, Value.Empty, "!");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.NEQUAL, 2, Value.Empty, "!=");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.NMATCH, 2, Value.Empty, "!~");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.MINUS, 1, Value.Empty, "-");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.ARROW, 2, Value.Empty, "->");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.PLUS, 1, Value.Empty, "+");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.STAR, 1, Value.Empty, "*");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.QUERY, 1, Value.Empty, "?");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.COLON, 1, Value.Empty, ":");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 5, Value.Get(new Mask("\\s")), "/");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.ASSIGN, 1, Value.Empty, "=");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.MATCH, 2, Value.Empty, "=~");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.EQUAL, 2, Value.Empty, "==");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.LESS, 1, Value.Empty, "<");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.LESSEQ, 2, Value.Empty, "<=");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.GREATER, 1, Value.Empty, ">");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.GREATEREQ, 2, Value.Empty, ">=");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.DOT, 1, Value.Empty, ".");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.COMMA, 1, Value.Empty, ",");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.SEMI, 1, Value.Empty, ";");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.KW_AND, 3, Value.Empty, "&");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.IDENT, 8, Value.Get("my_ident"), "m");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.COMMA, 1, Value.Empty, ",");  // divider
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.VALUE, 2, Value.Get(new Amount("23")), "2");
        }
Esempio n. 22
0
        public void ExprTokenTests_ParseReservedWord_DetectsReservedWords()
        {
            String          source   = "and div else false if or not true anything";
            InputTextStream inStream = new InputTextStream(source);

            ExprToken  token = new ExprToken();
            Func <int> act   = () => token.ParseReservedWord(inStream);

            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.KW_AND, 3, Value.Empty, "&");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.KW_DIV, 3, Value.Empty, "/");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.KW_ELSE, 4, Value.Empty, "else");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.VALUE, 5, Value.False, "false");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.KW_IF, 2, Value.Empty, "if");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.KW_OR, 2, Value.Empty, "|");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.EXCLAM, 3, Value.Empty, "!");
            ReadAndCheckTokenProps(act, ref token, inStream, 1, ExprTokenKind.VALUE, 4, Value.True, "true");
            ReadAndCheckTokenProps(act, ref token, inStream, 0, ExprTokenKind.UNKNOWN, 8, Value.Empty, String.Empty);
            ReadAndCheckTokenProps(act, ref token, inStream, -1, ExprTokenKind.UNKNOWN, 0, Value.Empty, String.Empty);
        }
Esempio n. 23
0
        public void ExprParser_Parse_HandlesAddExpression()
        {
            string          expr     = "2+3";
            InputTextStream inStream = new InputTextStream(expr);

            ExprParser parser = new ExprParser();
            ExprOp     result = parser.Parse(inStream);

            Assert.IsNotNull(result);
            Assert.AreEqual(OpKindEnum.O_ADD, result.Kind);
            Assert.AreEqual(2, result.Left.AsValue.AsLong);
            Assert.AreEqual(3, result.Right.AsValue.AsLong);

            // Just in case...
            EmptyScope scope = new EmptyScope();
            Value      val   = result.Calc(scope);

            Assert.AreEqual(5, val.AsLong);
        }
Esempio n. 24
0
        public ExprOp ParseCommaExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp node = ParseQuerycolonExpr(inStream, tFlags);

            if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE))
            {
                ExprOp next = null;
                while (true)
                {
                    ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT);
                    if (tok.Kind == ExprTokenKind.COMMA)
                    {
                        if (next == null)
                        {
                            ExprOp prev = node;
                            node      = new ExprOp(OpKindEnum.O_CONS);
                            node.Left = prev;
                            next      = node;
                        }

                        ExprToken ntok = NextToken(inStream, tFlags);
                        PushToken(ntok);
                        if (ntok.Kind == ExprTokenKind.RPAREN)
                        {
                            break;
                        }

                        ExprOp chain = new ExprOp(OpKindEnum.O_CONS);
                        chain.Left = ParseQuerycolonExpr(inStream, tFlags);

                        next.Right = chain;
                        next       = chain;
                    }
                    else
                    {
                        PushToken(tok);
                        break;
                    }
                }
            }

            return(node);
        }
Esempio n. 25
0
        public void ExprParser_Parse_HandlesExpressionsWithParenthesises()
        {
            string          expr     = "2+(3*(4 - 1)/5)";
            InputTextStream inStream = new InputTextStream(expr);

            ExprParser parser = new ExprParser();
            ExprOp     result = parser.Parse(inStream);

            Assert.IsNotNull(result);
            Assert.AreEqual(OpKindEnum.O_ADD, result.Kind);
            Assert.AreEqual(2, result.Left.AsValue.AsLong);

            Assert.AreEqual(OpKindEnum.O_DIV, result.Right.Kind);
            Assert.AreEqual(5, result.Right.Right.AsValue.AsLong);

            Assert.AreEqual(OpKindEnum.O_MUL, result.Right.Left.Kind);
            Assert.AreEqual(3, result.Right.Left.Left.AsValue.AsLong);

            Assert.AreEqual(OpKindEnum.O_SUB, result.Right.Left.Right.Kind);
            Assert.AreEqual(4, result.Right.Left.Right.Left.AsValue.AsLong);
            Assert.AreEqual(1, result.Right.Left.Right.Right.AsValue.AsLong);
        }
Esempio n. 26
0
        internal static uint InternalDigestState32(State32 state)
        {
            var  p    = new InputTextStream(state.mem32);
            long bEnd = state.memsize;
            uint h32;

            if (state.total_len >= 16)
            {
                h32 = XXH_rotl32(state.v1, 1) + XXH_rotl32(state.v2, 7) + XXH_rotl32(state.v3, 12) +
                      XXH_rotl32(state.v4, 18);
            }
            else
            {
                h32 = state.seed + PRIME32_5;
            }

            h32 += (uint)state.total_len;

            while (p.Position + 4 <= bEnd)
            {
                h32 += p.ReadUInt32() * PRIME32_3;
                h32  = XXH_rotl32(h32, 17) * PRIME32_4;
            }

            while (p.Position < bEnd)
            {
                h32 += p.ReadByte() * PRIME32_5;
                h32  = XXH_rotl32(h32, 11) * PRIME32_1;
            }

            h32 ^= h32 >> 15;
            h32 *= PRIME32_2;
            h32 ^= h32 >> 13;
            h32 *= PRIME32_3;
            h32 ^= h32 >> 16;

            return(h32);
        }
Esempio n. 27
0
        public override void Parse(InputTextStream inStream, AmountParseFlagsEnum flags = AmountParseFlagsEnum.PARSE_DEFAULT, string originalString = null)
        {
            ExprParser parser   = new ExprParser();
            int        startPos = inStream.Pos;

            Op = parser.Parse(inStream, flags, originalString);
            int endPos = inStream.Pos;

            if (!String.IsNullOrEmpty(originalString))
            {
                Text = originalString;
            }
            else if (endPos > startPos)
            {
                inStream.Pos = startPos;
                Text         = inStream.RemainSource.Substring(0, endPos - startPos);
                inStream.Pos = endPos;
            }
            else
            {
                Text = "<stream>";
            }
        }
Esempio n. 28
0
        public ExprOp ParseValueExpr(InputTextStream inStream, AmountParseFlagsEnum tFlags)
        {
            ExprOp node = ParseAssingExpr(inStream, tFlags);

            if (node != null && !tFlags.HasFlag(AmountParseFlagsEnum.PARSE_SINGLE))
            {
                ExprOp chain = null;
                while (true)
                {
                    ExprToken tok = NextToken(inStream, tFlags | AmountParseFlagsEnum.PARSE_OP_CONTEXT);
                    if (tok.Kind == ExprTokenKind.SEMI)
                    {
                        ExprOp seq = new ExprOp(OpKindEnum.O_SEQ);
                        if (chain == null)
                        {
                            seq.Left = node;
                            node     = seq;
                        }
                        else
                        {
                            seq.Left    = chain.Right;
                            chain.Right = seq;
                        }
                        seq.Right = ParseAssingExpr(inStream, tFlags);
                        chain     = seq;
                    }
                    else
                    {
                        PushToken(tok);
                        break;
                    }
                }
            }

            return(node);
        }
Esempio n. 29
0
        public int ParseReservedWord(InputTextStream inStream)
        {
            char c = inStream.Peek;

            if (Array.IndexOf(ReservedWordLetters, c) >= 0)
            {
                string buf;
                Length = inStream.ReadInto(out buf, out c, ch => char.IsLetter(ch));

                if (buf == "and")
                {
                    Symbol = "&";
                    Kind   = ExprTokenKind.KW_AND;
                    return(1);
                }

                if (buf == "div")
                {
                    Symbol = "/";
                    Kind   = ExprTokenKind.KW_DIV;
                    return(1);
                }

                if (buf == "else")
                {
                    Symbol = "else";
                    Kind   = ExprTokenKind.KW_ELSE;
                    return(1);
                }

                if (buf == "false")
                {
                    Symbol = "false";
                    Kind   = ExprTokenKind.VALUE;
                    Value  = Value.False;
                    return(1);
                }

                if (buf == "if")
                {
                    Symbol = "if";
                    Kind   = ExprTokenKind.KW_IF;
                    return(1);
                }

                if (buf == "or")
                {
                    Symbol = "|";
                    Kind   = ExprTokenKind.KW_OR;
                    return(1);
                }

                if (buf == "not")
                {
                    Symbol = "!";
                    Kind   = ExprTokenKind.EXCLAM;
                    return(1);
                }

                if (buf == "true")
                {
                    Symbol = "true";
                    Kind   = ExprTokenKind.VALUE;
                    Value  = Value.True;
                    return(1);
                }

                return(0);
            }
            return(-1);
        }
Esempio n. 30
0
 public void Rewind(InputTextStream inStream)
 {
     inStream.Pos = inStream.Pos - Length;
 }