예제 #1
0
        internal List <Token> CreateHierarchy()
        {
            List <Token> result = new List <Token>();

            for (int index = 0; index < elements.Count; index++)
            {
                Token elem = elements[index];

                if (elem is Text)
                {
                    result.Add(elem);
                }
                else if (elem is Expression)
                {
                    result.Add(elem);
                }
                else if (elem is Tag)
                {
                    result.Add(CollectForTag((Tag)elem, ref index));
                }
                else if (elem is StatementClose)
                {
                    throw new TmplException("1Close tag for [" + ((StatementClose)elem).Name + "] doesn't have matching start tag. " + elem.Line + "," + elem.Col, elem.Line, elem.Col);
                }
                else
                {
                    throw new TmplException("Invalid element: [" + elem.GetType().ToString() + "] " + elem.Line + "," + elem.Col, elem.Line, elem.Col);
                }
            }

            return(result);
        }
예제 #2
0
 ///======================================================================
 private void visitElement(Token elem)
 {
     if (elem is Expression)
     {
         visitExpression((Expression)elem);
     }
     else if (elem is Text)
     {
         visitText((Text)elem);
     }
     else if (elem is IfStatement)
     {
         visitTagIf((IfStatement)elem);
     }
     else if (elem is Tag)
     {
         visitTag((Tag)elem);
     }
     else if (elem is StatementClose)
     {
         visitTagClose((StatementClose)elem);
     }
     else
     {
         WriteLine("Unknown Token: " + elem.GetType().ToString());
     }
 }
예제 #3
0
        private Tag CollectForTag(Tag tag, ref int index)
        {
            if (tag.IsClosed)
            {
                return(tag);
            }

            if (string.Compare(tag.Name, "if", true) == 0)
            {
                tag = new IfStatement(tag.Line, tag.Col, tag.AttributeValue("test"));
            }

            Tag collectTag = tag;

            for (index++; index < elements.Count; index++)
            {
                Token elem = elements[index];

                if (elem is Text)
                {
                    collectTag.InnerTokens.Add(elem);
                }
                else if (elem is Expression)
                {
                    collectTag.InnerTokens.Add(elem);
                }
                else if (elem is Tag)
                {
                    Tag innerTag = (Tag)elem;

                    if (string.Compare(innerTag.Name, "else", true) == 0)
                    {
                        if (collectTag is IfStatement)
                        {
                            ((IfStatement)collectTag).FalseBranch = innerTag;
                            collectTag = innerTag;
                        }
                        else
                        {
                            throw new TmplException("else tag has to be positioned inside of if or elseif tag " + innerTag.Line + "," + innerTag.Col, innerTag.Line, innerTag.Col);
                        }
                    }
                    else if (string.Compare(innerTag.Name, "elseif", true) == 0)
                    {
                        if (collectTag is IfStatement)
                        {
                            Tag newTag = new IfStatement(innerTag.Line, innerTag.Col, innerTag.AttributeValue("test"));
                            ((IfStatement)collectTag).FalseBranch = newTag;
                            collectTag = newTag;
                        }
                        else
                        {
                            throw new TmplException("elseif tag is not positioned properly" + innerTag.Line + "," + innerTag.Col, innerTag.Line, innerTag.Col);
                        }
                    }
                    else
                    {
                        collectTag.InnerTokens.Add(CollectForTag(innerTag, ref index));
                    }
                }
                else if (elem is StatementClose)
                {
                    StatementClose tagClose = (StatementClose)elem;

                    return(tag);
                }
                else
                {
                    throw new TmplException("Invalid element: [" + elem.GetType().ToString() + "] " + elem.Line + "," + elem.Col, elem.Line, elem.Col);
                }
            }

            throw new TmplException("Start tag: [" + tag.Name + "] does not have matching end tag." + tag.Line + "," + tag.Col, tag.Line, tag.Col);
        }
예제 #4
0
파일: Tmpl.cs 프로젝트: windygu/sunrisetpl
 ///======================================================================
 private void visitElement(Token elem)
 {
     if (elem is Expression)
         visitExpression((Expression) elem);
     else if (elem is Text)
         visitText((Text) elem);
     else if (elem is IfStatement)
         visitTagIf((IfStatement) elem);
     else if (elem is Tag)
         visitTag((Tag) elem);
     else if (elem is StatementClose)
         visitTagClose((StatementClose) elem);
     else
         WriteLine("Unknown Token: " + elem.GetType().ToString());
 }