SHELL_SCRIPT
  COMMANDS_LIST
    FUNCTION_DEFINITION
      PsiElement(function)('function')
      PsiWhiteSpace(' ')
      PsiElement(word)('a')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement({)('{')
        PsiWhiteSpace(' ')
        COMPOUND_LIST
          WHILE_COMMAND
            PsiElement(while)('while')
            PsiWhiteSpace(' ')
            COMPOUND_LIST
              GENERIC_COMMAND_DIRECTIVE
                LITERAL
                  PsiElement(word)('a')
              PsiElement(;)(';')
            PsiWhiteSpace(' ')
            DO_BLOCK
              PsiElement(do)('do')
              PsiWhiteSpace(' ')
              COMPOUND_LIST
                PsiErrorElement:<pipeline command> or '\n' expected, got ';'
                  PsiElement(;)(';')
              PsiWhiteSpace(' ')
              PsiElement(done)('done')
          PsiErrorElement:'&', ';' or '\n' expected, got '}'
            <empty list>
        PsiWhiteSpace(' ')
        PsiElement(})('}')
  PsiElement(\n)('\n')
  COMMANDS_LIST
    FUNCTION_DEFINITION
      PsiElement(function)('function')
      PsiWhiteSpace(' ')
      PsiElement(word)('a')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement({)('{')
        COMPOUND_LIST
          PsiElement(\n)('\n')
          WHILE_COMMAND
            PsiElement(while)('while')
            PsiWhiteSpace(' ')
            COMPOUND_LIST
              GENERIC_COMMAND_DIRECTIVE
                LITERAL
                  PsiElement(word)('a')
              PsiElement(;)(';')
              PsiElement(\n)('\n')
            DO_BLOCK
              PsiElement(do)('do')
              COMPOUND_LIST
                PsiElement(\n)('\n')
                GENERIC_COMMAND_DIRECTIVE
                  LITERAL
                    PsiElement(word)('b')
                PsiElement(;)(';')
                PsiElement(\n)('\n')
              PsiElement(done)('done')
          PsiElement(\n)('\n')
        PsiElement(})('}')
  PsiElement(\n)('\n')
  COMMANDS_LIST
    FUNCTION_DEFINITION
      PsiElement(function)('function')
      PsiWhiteSpace(' ')
      PsiElement(word)('a')
      PsiWhiteSpace(' ')
      BLOCK
        PsiElement({)('{')
        PsiWhiteSpace(' ')
        COMPOUND_LIST
          WHILE_COMMAND
            PsiElement(while)('while')
            PsiWhiteSpace(' ')
            COMPOUND_LIST
              PsiErrorElement:<pipeline command> or '\n' expected, got ';'
                PsiElement(;)(';')
            PsiWhiteSpace(' ')
            DO_BLOCK
              PsiElement(do)('do')
              PsiWhiteSpace(' ')
              COMPOUND_LIST
                GENERIC_COMMAND_DIRECTIVE
                  LITERAL
                    PsiElement(word)('a')
                PsiElement(;)(';')
              PsiWhiteSpace(' ')
              PsiElement(done)('done')
          PsiErrorElement:'&', ';' or '\n' expected, got '}'
            <empty list>
        PsiWhiteSpace(' ')
        PsiElement(})('}')
  PsiElement(\n)('\n')
  COMMANDS_LIST
    SIMPLE_COMMAND
      GENERIC_COMMAND_DIRECTIVE
        LITERAL
          PsiElement(word)('echo')
      PsiWhiteSpace(' ')
      STRING
        PsiElement(OPEN_QUOTE)('"')
        PsiElement(STRING_CONTENT)('Example text')
        PsiElement(CLOSE_QUOTE)('"')