/*
 * 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
    #assign  // f.c.Assignment
        - assignment target: "xs"  // String
        - assignment operator: "="  // String
        - assignment source: [...]  // f.c.ListLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n"  // String
    #list  // f.c.IteratorBlock
        - list source: x  // f.c.Identifier
        - target loop variable: "xs"  // String
        #text  // f.c.TextBlock
            - content: "    "  // String
        ${...}  // f.c.DollarVariable
            - content: x  // f.c.Identifier
        #text  // f.c.TextBlock
            - content: "\n"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    #assign  // f.c.Assignment
        - assignment target: "a"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #assign  // f.c.Assignment
        - assignment target: "b"  // String
        - assignment operator: "="  // String
        - assignment source: 1  // f.c.NumberLiteral
        - variable scope: "1"  // Integer
        - namespace: null  // Null
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: b  // f.c.Identifier
        #text  // f.c.TextBlock
            - content: "    x\n"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: c  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n"  // String
    @  // f.c.UnifiedCall
        - callee: d  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\na\n"  // String
    #--...--  // f.c.Comment
        - content: " comment "  // String
    #text  // f.c.TextBlock
        - content: "b"  // String
