def parse_special_move
      s0 = @current_pos
      s1 = match_str("%")
      if s1 != :failed
        s3 = match_regexp(/^[\-+_A-Z]/)
        if s3 != :failed
          s2 = []
          while s3 != :failed
            s2 << s3
            s3 = match_regexp(/^[\-+_A-Z]/)
          end
        else
          s2 = :failed
        end
        if s2 != :failed
          if parse_nl != :failed
            @reported_pos = s0
            s0 = { "special" => s2.join }
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_special_move
      s0 = @current_pos
      s1 = match_str("%")
      if s1 != :failed
        s3 = match_regexp(/^[\-+_A-Z]/)
        if s3 != :failed
          s2 = []
          while s3 != :failed
            s2 << s3
            s3 = match_regexp(/^[\-+_A-Z]/)
          end
        else
          s2 = :failed
        end
        if s2 != :failed
          if parse_nl != :failed
            @reported_pos = s0
            s0 = { "special" => s2.join }
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
specialmove : "%" [-+_A-Z]+ nl