예제 #1
0
        private IToken processDelimiter(Delimiter d)
        {
            DelimiterProperties dp = d.DelimiterProperties;
            char beginChar         = dp.BeginChar == null ? '(' : dp.BeginChar.Val.ToString().Trim().ElementAt(0);
            char endChar           = dp.EndChar == null ? ')' : dp.EndChar.Val.ToString().Trim().ElementAt(0);

            var delimiterElements = d.Elements <Base>();

            if (delimiterElements.Count() > 1)
            {
                char           separator      = dp.SeparatorChar == null ? '|' : dp.SeparatorChar.Val.ToString().Trim().ElementAt(0);
                DelimiterToken delimiterToken = new DelimiterToken(beginChar, endChar, separator);

                foreach (var element in delimiterElements)
                {
                    var processedElement = processElement(element);
                    delimiterToken.AddElement(processedElement);
                }

                return(delimiterToken);
            }
            else
            {
                var children = from child in delimiterElements.First() select processElement(child);

                return(new ParenthesesToken(beginChar, endChar, new TokenList(children)));
            }
        }
예제 #2
0
        public void DelimiterToken_Uniqueness()
        {
            var delimiterToken = new DelimiterToken
            {
                StartTag             = "{{",
                EndTag               = "}}",
                Indent               = 0,
                ContentStartPosition = 0,
                ContentEndPosition   = 6,
                IsClosed             = true,
                TagStartPosition     = 0,
                TagEndPosition       = 6
            };

            var delimiterToken2 = new DelimiterToken
            {
                StartTag             = "{{",
                EndTag               = "}}",
                Indent               = 0,
                ContentStartPosition = 0,
                ContentEndPosition   = 6,
                IsClosed             = true,
                TagStartPosition     = 0,
                TagEndPosition       = 6
            };

            Assert.False(delimiterToken.Equals(null));
            Assert.Equal(delimiterToken, delimiterToken2);
            Assert.Equal(delimiterToken.GetHashCode(), delimiterToken2.GetHashCode());
        }
예제 #3
0
        protected ArgumentListNode parseArgumentList(DelimiterToken argumentList)
        {
            if (argumentList.BeginChar != '(' || argumentList.EndChar != ')' || argumentList.Delimiter != ',')
            {
                throw new ParseException(argumentList.simpleRepresentation() +
                                         " cannot be used as an argument list for a function call.");
            }

            ArgumentListNode argumentListNode = new ArgumentListNode();

            foreach (TokenList argument in argumentList.Elements)
            {
                TokenListParser argumentParser   = new TokenListParser(properties);
                SyntaxNode      argumentRootNode = argumentParser.parse(argument);
                argumentListNode.addArgument(argumentRootNode);
            }

            return(argumentListNode);
        }
예제 #4
0
        /// <summary>
        /// Tries to match delimiter tags from the current slice
        /// </summary>
        /// <param name="processor">The processor</param>
        /// <param name="slice">The slice</param>
        /// <returns>If the match was successful</returns>
        public override bool Match(Processor processor, ref StringSlice slice)
        {
            var tagStart = slice.Start - processor.CurrentTags.StartTag.Length;
            var index    = slice.Start;

            while (slice[index].IsWhitespace())
            {
                index++;
            }

            var match = slice[index];

            if (match == openingTagDelimiter[0])
            {
                index++;
                while (slice[index].IsWhitespace())
                {
                    index++;
                }

                slice.Start = index;
                var startIndex = slice.Start;

                // Take Characters that aren't whitespace
                while (!slice.CurrentChar.IsWhitespace())
                {
                    slice.NextChar();
                }

                var startTag = slice.ToString(startIndex, slice.Start);

                // Skip Whitespace any
                while (slice.CurrentChar.IsWhitespace())
                {
                    slice.NextChar();
                }

                var endTagStartIndex = slice.Start;

                // Take characters until end delimiter;
                var closingTag = closingTagDelimiter[0] + processor.CurrentTags.EndTag;
                while (!slice.IsEmpty && !slice.Match(closingTag))
                {
                    slice.NextChar();
                }

                var endTag = new StringSlice(slice.Text, endTagStartIndex, slice.Start - 1);
                endTag.TrimEnd();
                var contentEnd = endTag.End + 1;

                var tag = new DelimiterToken
                {
                    TagStartPosition     = tagStart,
                    ContentStartPosition = startIndex,
                    ContentEndPosition   = contentEnd,
                    TagEndPosition       = slice.Start + closingTag.Length,
                    StartTag             = startTag,
                    EndTag   = endTag.ToString(),
                    IsClosed = true
                };

                processor.CurrentToken = tag;

                processor.CurrentTags = new Classes.Tags(tag.StartTag, tag.EndTag);
                slice.Start          += closingTag.Length;

                return(true);
            }

            return(false);
        }