/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#mixed_content  // f.c.MixedContent
    #text  // f.c.TextBlock
        - content: "1 "  // String
    @  // f.c.UnifiedCall
        - callee: foo  // f.c.Identifier
        - argument name: "x"  // String
        - argument value: 1  // f.c.NumberLiteral
        - argument name: "y"  // String
        - argument value: 2  // f.c.NumberLiteral
        - target loop variable: "b1"  // String
        - target loop variable: "b2"  // String
        #text  // f.c.TextBlock
            - content: "x"  // String
    #text  // f.c.TextBlock
        - content: "\n2 "  // String
    @  // f.c.UnifiedCall
        - callee: .  // f.c.Dot
            - left-hand operand: ns  // f.c.Identifier
            - right-hand operand: "bar"  // String
        - argument value: 1  // f.c.NumberLiteral
        - argument value: 2  // f.c.NumberLiteral
        - target loop variable: "b1"  // String
        - target loop variable: "b2"  // String
        #text  // f.c.TextBlock
            - content: "y"  // String
    #text  // f.c.TextBlock
        - content: "\n3 "  // String
    #assign  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 123  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #assign  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 123  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: ns  // f.c.Identifier
    #global  // f.c.Assignment
        - assignment target: "x"  // String
        - assignment operator: "="  // String
        - assignment source: 123  // f.c.NumberLiteral
        - variable scope: "3"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n4 "  // String
    #if-#elseif-#else-container  // f.c.IfBlock
        #if  // f.c.ConditionalBlock
            - condition: ==  // f.c.ComparisonExpression
                - left-hand operand: +  // f.c.AddConcatExpression
                    - left-hand operand: x  // f.c.Identifier
                    - right-hand operand: 1  // f.c.NumberLiteral
                - right-hand operand: 0  // f.c.NumberLiteral
            - AST-node subtype: "0"  // Integer
            #text  // f.c.TextBlock
                - content: "foo"  // String
            ${...}  // f.c.DollarVariable
                - content: y  // f.c.Identifier
            #text  // f.c.TextBlock
                - content: "bar"  // String
        #else  // f.c.ConditionalBlock
            - condition: null  // Null
            - AST-node subtype: "1"  // Integer
            ${...}  // f.c.DollarVariable
                - content: "static"  // f.c.StringLiteral
            ${...}  // f.c.DollarVariable
                - content: dynamic "..."  // f.c.StringLiteral
                    - value part: "x"  // String
                    - value part: ${...}  // f.c.DollarVariable
                        - content: *  // f.c.ArithmeticExpression
                            - left-hand operand: baaz  // f.c.Identifier
                            - right-hand operand: 10  // f.c.NumberLiteral
                            - AST-node subtype: "1"  // Integer
                    - value part: "y"  // String
    #text  // f.c.TextBlock
        - content: "\n5 "  // String
    #switch  // f.c.SwitchBlock
        - value: x  // f.c.Identifier
        #case  // f.c.Case
            - condition: 1  // f.c.NumberLiteral
            - AST-node subtype: "0"  // Integer
            #text  // f.c.TextBlock
                - content: "one"  // String
        #case  // f.c.Case
            - condition: 2  // f.c.NumberLiteral
            - AST-node subtype: "0"  // Integer
            #text  // f.c.TextBlock
                - content: "two"  // String
        #default  // f.c.Case
            - condition: null  // Null
            - AST-node subtype: "1"  // Integer
            #text  // f.c.TextBlock
                - content: "more"  // String
    #text  // f.c.TextBlock
        - content: "\n6 "  // String
    #macro  // f.c.UnboundCallable
        - assignment target: "foo"  // String
        - parameter name: "x"  // String
        - parameter default: null  // Null
        - parameter name: "y"  // String
        - parameter default: 2  // f.c.NumberLiteral
        - parameter name: "z"  // String
        - parameter default: +  // f.c.AddConcatExpression
            - left-hand operand: y  // f.c.Identifier
            - right-hand operand: 1  // f.c.NumberLiteral
        - catch-all parameter name: "q"  // String
        - AST-node subtype: "0"  // Integer
        #nested  // f.c.BodyInstruction
            - passed value: x  // f.c.Identifier
            - passed value: y  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n7 "  // String
    #function  // f.c.UnboundCallable
        - assignment target: "foo"  // String
        - parameter name: "x"  // String
        - parameter default: null  // Null
        - parameter name: "y"  // String
        - parameter default: null  // Null
        - catch-all parameter name: null  // Null
        - AST-node subtype: "1"  // Integer
        #local  // f.c.Assignment
            - assignment target: "x"  // String
            - assignment operator: "="  // String
            - assignment source: 123  // f.c.NumberLiteral
            - variable scope: "2"  // Integer
            - namespace: null  // Null
        #return  // f.c.ReturnInstruction
            - value: 1  // f.c.NumberLiteral
    #text  // f.c.TextBlock
        - content: "\n8 "  // String
    #list  // f.c.IteratorBlock
        - list source: xs  // f.c.Identifier
        - target loop variable: "x"  // String
    #text  // f.c.TextBlock
        - content: "\n9 "  // String
    #list-#else-container  // f.c.ListElseContainer
        #list  // f.c.IteratorBlock
            - list source: xs  // f.c.Identifier
            #text  // f.c.TextBlock
                - content: "["  // String
            #items  // f.c.Items
                - target loop variable: "x"  // String
                ${...}  // f.c.DollarVariable
                    - content: x  // f.c.Identifier
                #sep  // f.c.Sep
                    #text  // f.c.TextBlock
                        - content: ", "  // String
            #text  // f.c.TextBlock
                - content: "]"  // String
        #else  // f.c.ElseOfList
            #text  // f.c.TextBlock
                - content: "None"  // String
    #text  // f.c.TextBlock
        - content: "\n10 "  // String
    #--...--  // f.c.Comment
        - content: " A comment "  // String
    #text  // f.c.TextBlock
        - content: "\n11 "  // String
    #outputformat  // f.c.OutputFormatBlock
        - value: "XML"  // f.c.StringLiteral
        #noautoesc  // f.c.NoAutoEscBlock
            ${...}  // f.c.DollarVariable
                - content: a  // f.c.Identifier
            #autoesc  // f.c.AutoEscBlock
                ${...}  // f.c.DollarVariable
                    - content: b  // f.c.Identifier
            ${...}  // f.c.DollarVariable
                - content: c  // f.c.Identifier
