Example #1
0
        private static void SerializeTokenString(XToken token, SerializationContext ctx)
        {
            var value = (string)token.Data;

            ctx.Builder.Append('"' + value + '"');
            ctx.LastIsAlphaNum = false;
        }
Example #2
0
        private static void SerializeTokenMatch(XToken token, SerializationContext ctx)
        {
            var mtk = (XTokenMatchParam)token;

            ctx.Builder.Append($"/{mtk.Data}/{mtk.Flags}");
            ctx.LastIsAlphaNum = true;
        }
Example #3
0
 private static void SerializeTokenRefId(XToken token, SerializationContext ctx)
 {
     if (ctx.LastIsAlphaNum)
     {
         ctx.Builder.Append(' ');
     }
     ctx.Builder.Append(token.Data);
     ctx.LastIsAlphaNum = true;
 }
Example #4
0
 private static void SerializeTokenOperMatch(XToken token, SerializationContext ctx)
 {
     if (ctx.LastIsAlphaNum)
     {
         ctx.Builder.Append(' ');
     }
     ctx.Builder.Append("match");
     ctx.LastIsAlphaNum = true;
 }
Example #5
0
        public static XTreeNodeBase Parse(string text)
        {
            var reader = new Reader(text ?? string.Empty);

            Scanner.Scan(reader);

            XToken partialTree = Parser.ResolveParensPair(reader.Tokens.GetEnumerator());

            return(Parser.BuildTree(partialTree));
        }
Example #6
0
        private static void SerializeTokenBoolean(XToken token, SerializationContext ctx)
        {
            if (ctx.LastIsAlphaNum)
            {
                ctx.Builder.Append(' ');
            }
            var value = (bool)token.Data;

            ctx.Builder.Append(value ? "true" : "false");
            ctx.LastIsAlphaNum = true;
        }
Example #7
0
        private static void SerializeTokenNumber(XToken token, SerializationContext ctx)
        {
            if (ctx.LastIsAlphaNum)
            {
                ctx.Builder.Append(' ');
            }
            var value = (double)token.Data;

            ctx.Builder.Append(value.ToString(CultureInfo.InvariantCulture));
            ctx.LastIsAlphaNum = true;
        }
 internal static XTreeNodeBase BuildTree(XToken token)
 {
     if (token is XTokenSubTree)
     {
         var source = token.Data as IReadOnlyList <XToken>;
         return(BuildTree(source, 0, source.Count - 1));
     }
     else if (token.Arity == 0)
     {
         return(new XTreeNodeTerminal(token));
     }
     else
     {
         throw new XParserException($"Unexpected token: {token}");
     }
 }
        private static XTreeNodeBase BuildTree(
            IReadOnlyList <XToken> source,
            int ixa,
            int ixb
            )
        {
            if (ixa > ixb)
            {
                throw new XParserException("Empty expression.");
            }
            else if (ixa == ixb)
            {
                return(BuildTree(source[ixa]));
            }

            for (int prio = 1; prio < 16; prio++)
            {
                for (int i = ixa; i <= ixb; i++)
                {
                    XToken token = source[i];
                    if (token.Prio == prio)
                    {
                        switch (token.Arity)
                        {
                        case 1:
                            return(new XTreeNodeUnary(
                                       token,
                                       BuildTree(source, i + 1, ixb)
                                       ));

                        case 2:
                            return(new XTreeNodeBinary(
                                       token,
                                       BuildTree(source, ixa, i - 1),
                                       BuildTree(source, i + 1, ixb)
                                       ));

                        default:
                            throw new XParserException($"Invalid operator type: {token}");
                        }
                    }
                }
            }

            throw new XParserException("Missing operator.");
        }
        private static XToken ScanTwins(
            Reader reader,
            char head,
            XToken result
            )
        {
            reader.MoveNext();

            char ch;

            if (reader.TryPeek(out ch) == false || ch != head)
            {
                throw new XParserException($"Illegal character found: {ch}");
            }

            reader.MoveNext();
            return(result);
        }
        internal static XToken ResolveParensPair(IEnumerator <XToken> iter)
        {
            var list = new List <XToken>();

            while (iter.MoveNext())
            {
                XToken token = iter.Current;
                if (token is XTokenLParen)
                {
                    token = ResolveParensPair(iter);
                }
                else if (token is XTokenRParen)
                {
                    break;
                }
                list.Add(token);
            }
            return(new XTokenSubTree(list));
        }
        internal static void Scan(Reader reader)
        {
            char ch;

            while (reader.TryPeek(out ch))
            {
                XToken token = null;
                switch (ch)
                {
                case '(':
                    reader.Tokens.Add(new XTokenLParen());
                    reader.MoveNext();
                    break;

                case ')':
                    reader.Tokens.Add(new XTokenRParen());
                    reader.MoveNext();
                    break;

                case '&': token = ScanTwins(reader, ch, new XTokenOperAnd()); break;

                case '|': token = ScanTwins(reader, ch, new XTokenOperOr()); break;

                case '!': token = ScanExclamationSign(reader, ch); break;

                case '=': token = ScanEqualSign(reader, ch); break;

                case '<': token = ScanLessSign(reader, ch); break;

                case '>': token = ScanGreaterSign(reader, ch); break;

                case '"': token = ScanString(reader, ch); break;

                case '\'': token = ScanString(reader, ch); break;

                case '/': token = ScanRegex(reader, ch); break;

                case '_': token = ScanLiteral(reader, ch); break;

                case '-': token = ScanNumber(reader, ch); break;

                case '+': token = ScanNumber(reader, ch); break;

                default:
                    if (char.IsWhiteSpace(ch))
                    {
                        reader.MoveNext();
                    }
                    else if (char.IsDigit(ch))
                    {
                        token = ScanNumber(reader, ch);
                    }
                    else if (char.IsLetter(ch))
                    {
                        token = ScanLiteral(reader, ch);
                    }
                    else
                    {
                        throw new XParserException($"Illegal character found: {ch}");
                    }
                    break;
                }

                if (token != null)
                {
                    reader.Tokens.Add(token);
                }
            }
        }
Example #13
0
 private static void SerializeTokenOperNot(XToken token, SerializationContext ctx)
 {
     ctx.Builder.Append("!");
     ctx.LastIsAlphaNum = false;
 }
Example #14
0
 public XTreeNodeTerminal(XToken token) : base(token)
 {
 }
Example #15
0
 private static void SerializeTokenOperGreaterOrEqualThan(XToken token, SerializationContext ctx)
 {
     ctx.Builder.Append(">=");
     ctx.LastIsAlphaNum = false;
 }
Example #16
0
 public XTreeNodeUnary(XToken token, XTreeNodeBase child) : base(token)
 {
     this.Child = child;
 }
Example #17
0
 public XTreeNodeBinary(XToken token, XTreeNodeBase left, XTreeNodeBase right) : base(token)
 {
     this.LeftChild  = left;
     this.RightChild = right;
 }
Example #18
0
 protected XTreeNodeBase(XToken token)
 {
     this.Token = token;
 }